265 votes

La façon la plus simple de lire JSON à partir d'une URL en Java

C'est peut-être une question stupide mais quelle est la façon la plus simple de lire et d'analyser JSON de URL sur Java ?

En Groovy, c'est une question de quelques lignes de code. Les exemples Java que je trouve sont ridiculement longs (et comportent un énorme bloc de gestion des exceptions).

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

9 votes

La gestion des exceptions est nécessaire car Java vous oblige à gérer toutes les exceptions qui sont déclarées. Qu'est-ce qui ne va pas avec la gestion des exceptions ?

3 votes

Eh bien, le "java vous force" est le plus gros problème.

9 votes

Si Java ne vous obligeait pas à gérer les exceptions, pensez-vous que les programmes fonctionneraient toujours et fonctionneraient bien ? Et si on me demandait d'entrer mon âge dans un programme et que je donnais snarfleblagger comme entrée ? Java devrait-il permettre au programme de s'exécuter sans problème ? Si vous ne voulez pas gérer les exceptions, déclarez-les comme étant lancées par les méthodes dans lesquelles elles peuvent apparaître et regardez votre programme échouer lorsque quelque chose n'est pas parfaitement correct.

208voto

Roland Illig Points 15357

Utilisation de l'artefact Maven org.json:json J'ai obtenu le code suivant, qui me semble assez court. Pas aussi court que possible, mais tout de même 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"));
  }
}

0 votes

Je n'avais pas réalisé que c'était si facile de créer un flux d'entrée à partir d'une url.

4 votes

Au lieu de lire caractère par caractère, vous pouvez utiliser readLine() sur BufferedReader. Cela réduira le nombre d'itérations de la boucle while.

8 votes

Pour quoi faire ? Le site readLine fera alors la boucle, et je dois concaténer les lignes au lieu des caractères, ce qui est plus coûteux. Cela ne permettrait pas de garder le code aussi court qu'il l'est maintenant. De plus, dans la notation JSON, il n'y a pas de concept de "lignes", alors pourquoi devrais-je les lire comme telles ?

71voto

StaxMan Points 34626

Voici quelques versions alternatives avec Jackson (car il y a plus d'une façon de vouloir des 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 notamment le cas habituel (IMO) où vous voulez traiter des objets Java, peut être fait en une seule ligne :

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

D'autres librairies, comme Gson, prennent également en charge des méthodes d'une ligne ; il est donc étrange que de nombreux exemples présentent des sections beaucoup plus longues. Pire encore, de nombreux exemples utilisent la bibliothèque obsolète org.json ; elle a peut-être été la première à exister, mais il existe une demi-douzaine de meilleures alternatives et il y a donc très peu de raisons de l'utiliser.

0 votes

Qu'est-ce que l'url ici ? Est-ce une chaîne de caractères, un objet URL ou un byte[] ?

1 votes

Je pensais à java.net.URL mais l'une ou l'autre fonctionne, ainsi que de nombreuses autres sources ( File , InputStream , Reader , String ).

4 votes

Il devrait soit java.net.URL dans l'exemple ci-dessus, sinon il essaiera d'analyser la chaîne 'http://....' comme un json, ce qui entraînera une erreur.

68voto

user2654569 Points 74

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

En voici un exemple. Je vais sur le site d'un géolocalisateur gratuit, j'analyse le json et j'affiche mon code postal. (je mets juste 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

1 votes

Pourquoi est-ce que je reçois l'erreur 'NetworkOnMainThreadException' ? Je dois utiliser une AsyncTask ou il y a un autre moyen ? Dans cet exemple, avez-vous également obtenu cette erreur ?

0 votes

Une faute de frappe, ça devrait être : rootobj.get("zip_code").getAsString();

0 votes

Comment importer le jsonParser ? J'obtiens toujours l'erreur suivante : 'Error :(69, 9) error : cannot find symbol class JsonParser'.

6voto

Jon Snyder Points 1602

Utilice HttpClient pour récupérer le contenu de l'URL. Et ensuite utiliser 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 essayer d'utiliser une bibliothèque java de l'API Facebook. Je n'ai pas d'expérience dans ce domaine, mais il y a une question sur stack overflow relative à Utilisation d'une API Facebook en java . Vous pouvez consulter RestFB comme un bon choix pour une bibliothèque à utiliser.

2voto

kunal Points 4181

Je ne suis pas sûr que ce soit efficace, mais c'est l'un des moyens possibles :

Lire le json de l'url utiliser url.openStream() et lire le contenu dans une chaîne de caractères.

construire un objet JSON avec cette chaîne de caractères (plus d'informations à la page json.org )

JSONObject(java.lang.String source)
      Construct a JSONObject from a source JSON text string.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X