modo più semplice per leggere json da un URL in java

Questa potrebbe essere una domanda stupida, ma qual è il modo più semplice per leggere e analizzare JSON dall’URL in Java ?

In Groovy, si tratta di poche righe di codice. Gli esempi Java che trovo sono ridicolmente lunghi (e hanno un enorme blocco di gestione delle eccezioni).

Tutto quello che voglio fare è leggere il contenuto di questo link .

Usando l’artefatto Maven org.json:json Ho ricevuto il seguente codice, che penso sia piuttosto breve. Non il più breve ansible, ma comunque utilizzabile.

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

Qui ci sono un paio di versioni alternative con Jackson (dal momento che ci sono più di un modo in cui potresti desiderare i dati):

  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 map = mapper.readValue(url, Map.class); 

E in particolare il solito caso (IMO) in cui vuoi trattare oggetti Java, può essere realizzato con un solo liner:

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

Altre librerie come Gson supportano anche i metodi a una riga; perché molti esempi mostrano sezioni molto più lunghe è dispari. E ancora peggio è che molti esempi utilizzano la libreria org.json obsoleta; potrebbe essere stata la prima cosa in circolazione, ma ci sono una mezza dozzina di alternative migliori quindi non ci sono molte ragioni per usarlo.

Il modo più semplice: usa gson, la libreria goto json di google. https://code.google.com/p/google-gson/

Ecco un esempio. Sto andando a questo sito gratuito di geolocalizzatore e analizzando il json e visualizzando il mio codice postale. (metti questa roba in un metodo principale per testarlo)

  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 

Se non ti dispiace usare una coppia di librerie, puoi farlo in una sola riga.

Includi IOUtils di Apache Commons e librerie di json.org .

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

Utilizzare HttpClient per afferrare il contenuto dell’URL. E poi usa la libreria da json.org per analizzare il JSON. Ho usato queste due librerie su molti progetti e sono state robuste e semplici da usare.

Oltre a questo puoi provare a utilizzare una libreria java dell’API di Facebook. Non ho alcuna esperienza in questo settore, ma c’è una domanda sullo stack overflow relativa all’utilizzo di un’API di Facebook in java . Si consiglia di guardare a RestFB come una buona scelta per una libreria da utilizzare.

Ho fatto il parser JSON nel modo più semplice, eccolo qui

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

questa class restituisce l’object json dall’URL

e quando si desidera l’object json, si chiama questa class e il metodo nella class Activity

il mio codice è qui

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

qui la “chiave json” è indicata come la chiave nel file json

questo è un semplice esempio di file json

 { "json":"hi" } 

Qui “json” è la chiave e “ciao” è valore

Ciò porterà il tuo valore json al contenuto di stringhe.

È molto facile, usando jersey-client, basta includere questa dipendenza di tipo Maven:

  org.glassfish.jersey.core jersey-client 2.25.1  

Quindi invocalo usando questo esempio:

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

Quindi usa Google Gson per analizzare il JSON:

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

Non sono sicuro che sia efficiente, ma questo è uno dei modi possibili:

Leggi json url.openStream() usa url.openStream() e leggi il contenuto in una stringa.

build un object JSON con questa stringa (altro su json.org )

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