web-dev-qa-db-pt.com

maneira mais simples de ler json de uma URL em java

Essa pode ser uma pergunta idiota, mas qual é a maneira mais simples de ler e analisar JSON de URL em Java ?

No Groovy, é uma questão de poucas linhas de código. Os exemplos de Java que eu acho são ridiculamente longos (e têm um enorme bloco de manipulação de exceções).

Tudo que eu quero fazer é ler o conteúdo de este link .

229
Pomponius

Usando o artefato Maven org.json:json eu peguei o seguinte código, que acho bem curto. Não tão curto quanto possível, mas ainda utilizável.

package so4308554;

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.io.Reader;
import Java.net.URL;
import Java.nio.charset.Charset;

import org.json.JSONException;
import org.json.JSONObject;

public class JsonReader {

  private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
      sb.append((char) cp);
    }
    return sb.toString();
  }

  public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
      String jsonText = readAll(rd);
      JSONObject json = new JSONObject(jsonText);
      return json;
    } finally {
      is.close();
    }
  }

  public static void main(String[] args) throws IOException, JSONException {
    JSONObject json = readJsonFromUrl("https://graph.facebook.com/19292868552");
    System.out.println(json.toString());
    System.out.println(json.get("id"));
  }
}
182
Roland Illig

Aqui estão algumas versões alternativas com Jackson (já que existem mais de uma maneira pela qual você pode querer dados como):

  ObjectMapper mapper = new ObjectMapper(); // just need one
  // Got a Java class that data maps to nicely? If so:
  FacebookGraph graph = mapper.readValue(url, FaceBookGraph.class);
  // Or: if no class (and don't need one), just map to Map.class:
  Map<String,Object> map = mapper.readValue(url, Map.class);

E especificamente o caso usual (IMO) onde você quer lidar com objetos Java, pode ser feito um forro:

FacebookGraph graph = new ObjectMapper().readValue(url, FaceBookGraph.class);

Outras bibliotecas como o Gson também suportam métodos de uma linha; por que muitos exemplos mostram que seções muito mais longas são ímpares. E o pior é que muitos exemplos usam bibliotecas org.json obsoletas; pode ter sido a primeira coisa ao redor, mas há meia dúzia de alternativas melhores, então há muito pouca razão para usá-la.

63
StaxMan

A maneira mais fácil: Use o gson, a biblioteca goto goto do google. https://code.google.com/p/google-gson/

Aqui está uma amostra. Eu estou indo para este site gratuito geolocator e analisando o json e exibindo meu CEP. (basta colocar essas coisas em um método principal para testá-lo)

    String sURL = "http://freegeoip.net/json/"; //just a string

    // Connect to the URL using Java's native library
    URL url = new URL(sURL);
    URLConnection request = url.openConnection();
    request.connect();

    // Convert to a JSON object to print data
    JsonParser jp = new JsonParser(); //from gson
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element
    JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object. 
    String zipcode = rootobj.get("Zip_code").getAsString(); //just grab the zipcode
54
user2654569

Se você não se importa em usar algumas bibliotecas, isso pode ser feito em uma única linha.

Incluir Apache Commons IOUtils & json.org bibliotecas.

JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
37
ezwrighter

Use HttpClient para pegar o conteúdo do URL. E então use a biblioteca de json.org para analisar o JSON. Eu usei essas duas bibliotecas em muitos projetos e elas foram robustas e simples de usar.

Além disso, você pode tentar usar uma biblioteca Java da API do Facebook. Eu não tenho nenhuma experiência nesta área, mas há uma pergunta sobre estouro de pilha relacionado a sando uma API do Facebook em Java . Você pode querer olhar para RestFB como uma boa escolha para uma biblioteca usar.

6
Jon Snyder

Eu fiz o analisador json da maneira mais simples, aqui está

package com.inzane.shoapp.activity;

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.io.UnsupportedEncodingException;

import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.ClientProtocolException;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import Android.util.Log;

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
            System.out.println(line);
        }
        is.close();
        json = sb.toString();

    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
        System.out.println("error on parse data in jsonparser.Java");
    }

    // return JSON String
    return jObj;

}
}

esta classe retorna o objeto json do url

e quando você quer o objeto json, você acabou de chamar esta classe e o método na sua classe Activity

meu código está aqui

String url = "your url";
JSONParser jsonParser = new JSONParser();
JSONObject object = jsonParser.getJSONFromUrl(url);
String content=object.getString("json key");

aqui a "chave json" é denotada que a chave no seu arquivo json

este é um exemplo simples de arquivo json

{
    "json":"hi"
}

Aqui "json" é fundamental e "oi" é valor

Isto irá obter o seu valor json para o conteúdo da string.

5
Ribin Das

É muito fácil, usando o jersey-client, basta incluir essa dependência do maven:

<dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>2.25.1</version>
</dependency>

Em seguida, invoque-o usando este exemplo:

String json = ClientBuilder.newClient().target("http://api.coindesk.com/v1/bpi/currentprice.json").request().accept(MediaType.APPLICATION_JSON).get(String.class);

Em seguida, use o Gson do Google para analisar o JSON:

Gson gson = new Gson();
Type gm = new TypeToken<CoinDeskMessage>() {}.getType();
CoinDeskMessage cdm = gson.fromJson(json, gm);
3
user3892260

Não tenho certeza se isso é eficiente, mas essa é uma das maneiras possíveis:

Leia json do url use url.openStream() e leia o conteúdo em uma string.

construa um objeto JSON com essa string (more at json.org )

JSONObject(Java.lang.String source)
      Construct a JSONObject from a source JSON text string.
2
kunal