Parsing JSON dall’URL

C’è un modo più semplice per analizzare JSON da un URL? Ho usato Gson non riesco a trovare alcun utile esempio.

  1. Per prima cosa devi scaricare l’URL (come testo):

    private static String readUrl(String urlString) throws Exception { BufferedReader reader = null; try { URL url = new URL(urlString); reader = new BufferedReader(new InputStreamReader(url.openStream())); StringBuffer buffer = new StringBuffer(); int read; char[] chars = new char[1024]; while ((read = reader.read(chars)) != -1) buffer.append(chars, 0, read); return buffer.toString(); } finally { if (reader != null) reader.close(); } } 
  2. Quindi devi analizzarlo (e qui hai alcune opzioni).

    • GSON (esempio completo):

       static class Item { String title; String link; String description; } static class Page { String title; String link; String description; String language; List items; } public static void main(String[] args) throws Exception { String json = readUrl("http://www.javascriptkit.com/" + "dhtmltutors/javascriptkit.json"); Gson gson = new Gson(); Page page = gson.fromJson(json, Page.class); System.out.println(page.title); for (Item item : page.items) System.out.println(" " + item.title); } 

      Uscite:

       javascriptkit.com Document Text Resizer JavaScript Reference- Keyboard/ Mouse Buttons Events Dynamically loading an external JavaScript or CSS file 
    • Prova l’API java da json.org :

       try { JSONObject json = new JSONObject(readUrl("...")); String title = (String) json.get("title"); ... } catch (JSONException e) { e.printStackTrace(); } 

È ansible utilizzare org.apache.commons.io.IOUtils per il download e org.json.JSONTokener per l’analisi:

 JSONObject jo = (JSONObject) new JSONTokener(IOUtils.toString(new URL("http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json"))).nextValue(); System.out.println(jo.getString("version")); 

GSON ha un costruttore che accetta un object Reader : fromJson (Reader json, Class classOfT) .

Ciò significa che puoi creare un Reader da un URL e poi passarlo a Gson per consumare il stream e effettuare la deserializzazione.

Solo tre righe di codice rilevante.

 import java.io.InputStreamReader; import java.net.URL; import java.util.Map; import com.google.gson.Gson; public class GsonFetchNetworkJson { public static void main(String[] ignored) throws Exception { URL url = new URL("https://httpbin.org/get?color=red&shape=oval"); InputStreamReader reader = new InputStreamReader(url.openStream()); MyDto dto = new Gson().fromJson(reader, MyDto.class); // using the deserialized object System.out.println(dto.headers); System.out.println(dto.args); System.out.println(dto.origin); System.out.println(dto.url); } private class MyDto { Map headers; Map args; String origin; String url; } } 

Ecco un metodo semplice.

Prima analizzare il JSON dall’URL –

 public String readJSONFeed(String URL) { StringBuilder stringBuilder = new StringBuilder(); HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(URL); try { HttpResponse response = httpClient.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream inputStream = entity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { stringBuilder.append(line); } inputStream.close(); } else { Log.d("JSON", "Failed to download file"); } } catch (Exception e) { Log.d("readJSONFeed", e.getLocalizedMessage()); } return stringBuilder.toString(); } 

Quindi posizionare un’attività e quindi leggere il valore desiderato da JSON –

 private class ReadPlacesFeedTask extends AsyncTask { protected String doInBackground(String... urls) { return readJSONFeed(urls[0]); } protected void onPostExecute(String result) { JSONObject json; try { json = new JSONObject(result); ////CREATE A JSON OBJECT//// JSONObject data = json.getJSONObject("JSON OBJECT NAME"); ////GET A STRING//// String title = data.getString(""); //Similarly you can get other types of data //Replace String to the desired data type like int or boolean etc. } catch (JSONException e1) { e1.printStackTrace(); } //GETTINGS DATA FROM JSON ARRAY// try { JSONObject jsonObject = new JSONObject(result); JSONArray postalCodesItems = new JSONArray( jsonObject.getString("postalCodes")); JSONObject postalCodesItem = postalCodesItems .getJSONObject(1); } catch (Exception e) { Log.d("ReadPlacesFeedTask", e.getLocalizedMessage()); } } } 

È quindi ansible inserire un’attività come questa –

 new ReadPlacesFeedTask() .execute("JSON URL"); 
 public static TargetClassJson downloadPaletteJson(String url) throws IOException { if (StringUtils.isBlank(url)) { return null; } String genreJson = IOUtils.toString(new URL(url).openStream()); return new Gson().fromJson(genreJson, TargetClassJson.class); } 
  import org.apache.commons.httpclient.util.URIUtil; import org.apache.commons.io.FileUtils; import groovy.json.JsonSlurper; import java.io.File; tmpDir = "/defineYourTmpDir" URL url = new URL("http://yourOwnURL.com/file.json"); String path = tmpDir + "/tmpRemoteJson" + ".json"; remoteJsonFile = new File(path); remoteJsonFile.deleteOnExit(); FileUtils.copyURLToFile(url, remoteJsonFile); String fileTMPPath = remoteJsonFile.getPath(); def inputTMPFile = new File(fileTMPPath); remoteParsedJson = new JsonSlurper().parseText(inputTMPFile.text); 

Io uso java 1.8 con com.fasterxml.jackson.databind.ObjectMapper

 ObjectMapper mapper = new ObjectMapper(); Integer value = mapper.readValue(new URL("your url here"), Integer.class); 

Integer.class può essere anche un tipo complesso. Per esempio usato.

Una semplice soluzione alternativa:

  • Incolla l’URL in un convertitore da json a csv

  • Apri il file CSV in Excel o Open Office

  • Utilizzare gli strumenti del foglio di calcolo per analizzare i dati