2016-03-28 23 views
1

Ich versuche, Wert von JSON aus der URL unter Verwendung Gson Java-Bibliothek zur Verfügung gestellt zu extrahieren: http://api.wunderground.com/api/b28d047ca410515a/forecast/q/-33.912,151.013.jsonExtract Wert von Json mit Gson

Ich habe erfolgreich den Code verwendet, unten zur Verfügung gestellten Daten von URL zu extrahieren unter: http://api.wunderground.com/api/b28d047ca410515a/conditions/q/-33.912,151.013.json

Code:

String url = "http://api.wunderground.com/api/b28d047ca410515a/conditions/q/-33.912,151.013.json"; 
    String url2 = "http://api.wunderground.com/api/b28d047ca410515a/forecast/q/-33.912,151.013.json"; 

      InputStream is = null; 
      try { 
       is = new URL(url).openStream(); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
       String jsonText = readAll(rd); 

       JsonElement je = new JsonParser().parse(jsonText); 

       System.out.println("Current Temperature:" + getAtPath(je, "current_observation/temp_c").getAsString()); 


      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 

      } finally { 
       try { 
        if (is != null) 
         is.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

aber ich Ausnahme bin immer versuchen, von url2 zu extrahieren, wie pro Code unten, so scheint es, eine complica zu sein Ted Json, um Werte zu erhalten, bitte jede Hilfe?

// below code not working 

      weather_icon_url = getAtPath(je, "current_observation/icon_url").getAsString(); 

      is = new URL(url2).openStream(); 
      BufferedReader rd2 = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
      String jsonText2 = readAll(rd2); 

      JsonElement je2 = new JsonParser().parse(jsonText2); 

      System.out.println("max Temperature:" + getAtPath(je2, "forecast/simpleforecast/forecastday/high/celsius").getAsString()); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } finally { 
      try { 
       if (is != null) 
        is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

getAtPath Code:

private static JsonElement getAtPath(JsonElement e, String path) { 
     JsonElement current = e; 
     String ss[] = path.split("/"); 
     for (int i = 0; i < ss.length; i++) { 
      current = current.getAsJsonObject().get(ss[i]); 
     } 
     return current; 
    } 
+0

Welche Ausnahme erhalten Sie? Bitte geben Sie die Implementierung von 'getAtPath' an. – dShringi

+0

Ich bekomme folgende Ausnahme: Verursacht von: java.lang.IllegalStateException: Kein JSON-Objekt: [{"date": {"epoch": "1459152000", "........... – Ossama

Antwort

1

Das Problem Sie konfrontiert sind, ist, weil es ein Problem mit der Implementierung getAtPath ist.

[{"date":{"epoch":"1459152000"... repräsentiert ein JSONArray, auf das die Methode als JSONObject zuzugreifen versucht. Daher die IllegalStateException.

JsonObject com.google.gson.JsonElement.getAsJsonObject()

bequeme Methode, um dieses Element als JsonObject zu erhalten. Wenn das Element von einem anderen Typ ist, wird eine IllegalStateException ausgelöst. Daher ist es am besten, diese Methode zu verwenden, nachdem sichergestellt wurde, dass dieses Element vom Typ ist, indem zuerst isJsonObject() aufgerufen wird.

Sie können etwas wie unten aktualisieren und verwenden, ab sofort gibt es nur das erste Element zurück.

private static JsonElement getAtPath(JsonElement e, String path) { 
     JsonElement current = e; 
     String ss[] = path.split("/"); 
     for (int i = 0; i < ss.length; i++) { 
      if(current instanceof JsonObject){ 
       current = current.getAsJsonObject().get(ss[i]); 
      } else if(current instanceof JsonArray){ 
       JsonElement jsonElement = current.getAsJsonArray().get(0); 
       current = jsonElement.getAsJsonObject().get(ss[i]); 
      } 
     } 
     return current; 
    } 
+0

Thx Kumpel, helfen Sie dem Noob setzen Sie dies in Code pls – Ossama

+0

Gern geschehen. Bitte vergessen Sie nicht, die Antwort zu akzeptieren: P – dShringi

+0

thx, vergessen Sie nicht, meine Frage zu mögen, heheh – Ossama

0

Dies sollte funktionieren:

System.out.println("max Temperature:" + getAtPath(je2, "forecast/simpleforecast/forecastday/high/celsius").getAsString()); 
+0

nicht funktioniert, wirft es die folgende Ausnahme auf: Verursacht von: java.lang.IllegalStateException: Kein JSON-Objekt: [{"date": {"epoch": "1459152000", "........... – Ossama

+1

Das ist, weil der zurückgegebene JSON tatsächlich ein Array ist. Kannst du die getAtPath-Methode auch posten? – Milan

+0

getAtPath-Code zu obigem hinzugefügt. thx – Ossama