web-dev-qa-db-fra.com

moyen le plus simple de lire JSON à partir d'une URL dans java

C’est peut-être une question idiote, mais quel est le moyen le plus simple de lire et d’analyser JSON à partir de URL dans Java ?

Dans Groovy, il s’agit de quelques lignes de code. Java exemples que je trouve sont ridiculement longs (et ont un énorme bloc de gestion des exceptions).

Tout ce que je veux, c'est lire le contenu de ce lien .

231
Pomponius

Utilisation de l'artefact Maven org.json:json J'ai obtenu le code suivant, qui est assez court, je pense. Pas aussi court que possible, mais toujours utilisable.

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"));
  }
}
184
Roland Illig

Voici quelques versions alternatives avec Jackson (car il existe plusieurs manières pour lesquelles vous souhaitez utiliser les données):

  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);

Et plus précisément, le cas habituel (IMO) dans lequel vous souhaitez traiter des objets Java peut être créé en une ligne:

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

D'autres bibliothèques comme Gson supportent également les méthodes à une ligne; pourquoi de nombreux exemples montrent des sections beaucoup plus longues est étrange. Et pire encore, de nombreux exemples utilisent la bibliothèque obsolète org.json; c’était peut-être la première chose à faire, mais il existe une demi-douzaine de solutions de rechange meilleures et il n’ya donc que très peu de raisons de l’utiliser.

63
StaxMan

Le moyen le plus simple: Utilisez gson, la bibliothèque goto json de Google. https://code.google.com/p/google-gson/

Voici un échantillon. Je vais sur ce site gratuit de géolocalisation et j'analyse le json et affiche mon code postal. (il suffit de mettre ce truc dans une méthode principale pour le tester)

    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
55
user2654569

Si cela ne vous dérange pas d'utiliser deux ou trois bibliothèques, vous pouvez le faire en une seule ligne.

Incluez les bibliothèques Apache Commons IOUtils & json.org .

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

Utilisez HttpClient pour récupérer le contenu de l'URL. Et utilisez ensuite la bibliothèque de json.org pour analyser le JSON. J'ai utilisé ces deux bibliothèques sur de nombreux projets et elles ont été robustes et simples à utiliser.

Sinon, vous pouvez utiliser une bibliothèque Facebook API Java. Je n'ai aucune expérience dans ce domaine, mais il y a une question sur le dépassement de capacité de la pile lié à en utilisant une API Facebook en Java . Vous voudrez peut-être regarder RestFB comme un bon choix pour une bibliothèque.

6
Jon Snyder

J'ai fait l'analyseur JSON de la manière la plus simple, le voici

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;

}
}

cette classe retourne l'objet json de l'url

et quand vous voulez que l'objet json vous appelez juste cette classe et la méthode dans votre classe d'activité

mon code est ici

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

ici la "clé json" est notée que la clé dans votre fichier json

ceci est un exemple de fichier JSON simple

{
    "json":"hi"
}

Ici "json" est la clé et "hi" est la valeur

Cela donnera votre valeur JSON au contenu de la chaîne.

5
Ribin Das

C'est très facile, en utilisant jersey-client, incluez simplement cette dépendance maven:

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

Puis appelez-le en utilisant cet exemple:

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

Ensuite, utilisez Google Gson pour analyser le JSON:

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

Je ne suis pas sûr que cela soit efficace, mais c’est l’une des manières possibles:

Lire JSON à partir de l'URL utiliser url.openStream() et lire le contenu dans une chaîne.

construire un objet JSON avec cette chaîne (plus sur json.org )

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