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 analyser JSON de URL dans Java ?

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

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

209
demandé sur Atish Dipongkor 2010-11-30 01:05:25

8 réponses

utilisant l'artefact Maven org.json:json j'ai eu le code suivant, qui je pense est assez court. Pas aussi court que possible, mais encore 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"));
  }
}
173
répondu Roland Illig 2010-11-29 22:26:14

voici quelques versions alternatives avec Jackson (car il y a plus d'une façon que vous pourriez vouloir des données comme):

  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 spécifiquement le cas habituel (IMO) où vous voulez traiter avec des objets Java, peut être fait une doublure:

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

D'autres libs comme Gson prennent également en charge les méthodes à une ligne; pourquoi de nombreux exemples montrent des sections beaucoup plus longues est étrange. Et le pire est que de nombreux exemples utilisent obsolète org.bibliothèque json; il peut avoir été la première chose autour, mais il ya une demi-douzaine de meilleures alternatives, Il ya donc très peu de raisons de l'utiliser.

61
répondu StaxMan 2010-11-30 03:29:03

la manière la plus facile: Utilisez gson,la bibliothèque goto json de google. https://code.google.com/p/google-gson /

voici un échantillon. Je vais sur ce site de géolocalisation gratuit et j'analyse le json et j'affiche mon code ZIP. (viens de mettre ce genre de choses dans une méthode main pour 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
45
répondu user2654569 2018-06-29 13:35:18

si cela ne vous dérange pas d'utiliser quelques bibliothèques, cela peut être fait en une seule ligne.

Include Apache Commons IOUtils & json.org bibliothèques.

JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
27
répondu ezwrighter 2014-11-19 22:50:59

Utiliser HttpClient pour saisir le contenu de l'URL. Et puis 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 API Facebook. Je n'ai aucune expérience dans ce domaine, mais il y a une question sur le débordement de la pile liée à en utilisant une API Facebook en java . Vous pouvez vouloir regarder RestFB comme un bon choix pour une bibliothèque à utiliser.

6
répondu Jon Snyder 2018-03-21 07:19:57

j'ai fait l'analyseur json de la manière la plus simple, 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 renvoie l'objet json de l'url

et quand vous voulez 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

c'est un simple exemple de fichier json

{
    "json":"hi"
}

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

cela va obtenir votre valeur json pour le contenu de chaîne.

5
répondu Ribin Das 2014-02-24 06:21:11

c'est très facile, en utilisant jersey-client, il suffit d'inclure cette dépendance maven:

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

puis l'invoquer 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);

puis utiliser Google Gson pour analyser le JSON:

Gson gson = new Gson();
Type gm = new TypeToken<CoinDeskMessage>() {}.getType();
CoinDeskMessage cdm = gson.fromJson(json, gm);
4
répondu user3892260 2017-03-12 18:56:22

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

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

construisez un objet JSON avec cette chaîne (plus à json.org )

JSONObject(java.lang.String source)
      Construct a JSONObject from a source JSON text string.
2
répondu kunal 2010-11-29 22:15:27