2011-09-19 12 views
37

Esiste un modo più semplice per analizzare JSON da un URL? Ho usato Gson non riesco a trovare alcun utile esempio.Analisi di JSON dall'URL

+1

Hai un esempio? –

+0

per esempio sarà come questo http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json o dal grafico facebook – Peril

risposta

63
  1. In primo luogo è necessario 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. Poi è necessario analizzarlo (e qui si hanno 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<Item> 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 API java da json.org:

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

il tag 'java' indica che non vuole usare javascript. –

+0

http://json.org/java – Anders

+0

questo analizzerà un url? – Peril

9

Potreste usare org.apache.commons.io.IOUtils per il download e per l'analisi org.json.JSONTokener:

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")); 
+2

Penso che devi aggiungere '.openStream()' dopo 'new URL (...)'. Quindi deve apparire così: 'JSONObject jo = (JSONObject) new JSONTokener (IOUtils.toString (new URL (" http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json ") .openStream())). nextValue(); ' – Selphiron

+0

@ Selphiron, funziona perfettamente. Molte grazie. – mahi

1

Ecco un metodo semplice.

Prima di analizzare il JSON da 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 inserire un compito e poi leggere il valore desiderato da JSON -

private class ReadPlacesFeedTask extends AsyncTask<String, Void, String> { 
    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()); 
     } 
    } 
} 

È possibile quindi inserire un compito come questo -

new ReadPlacesFeedTask() 
    .execute("JSON URL"); 
-6

Una semplice soluzione alternativa:

  • incollare l'URL in un JSON al convertitore csv

  • Aprire il file CSV sia in Excel o Open Office

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

+2

Questa è una risposta di qualità molto bassa. Non penso che l'uso di Excel sia una soluzione complessa a questo problema. –

+0

promozione di un convertitore da json a csv forse? – zundi

0
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); 
1
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); 
    } 
8

GSON ha un costruttore th a prende un oggetto Reader: fromJson(Reader json, Class classOfT).

Ciò significa che è possibile creare un Reader da un URL e quindi passarlo a Gson per consumare il flusso e effettuare la deserializzazione.

Solo tre righe del codice pertinente.

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<String, String> headers; 
     Map<String, String> args; 
     String origin; 
     String url; 
    } 
} 
+0

cosa succede se il json - args ha gli elementi dell'array? –

+0

@Sundar: per gli array si usa TypeToken: https://stackoverflow.com/a/10292824/191246 – ccpizza

0

ho usare 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.