2016-03-28 3 views
1

Я пытаюсь извлечь значения из JSON из URL, представленной ниже, используя GSON Java библиотеки: http://api.wunderground.com/api/b28d047ca410515a/forecast/q/-33.912,151.013.jsonзначение Выписка из Json с помощью Gson

Я успешно использовал код, предоставленный ниже, чтобы извлечь данные из URL ниже: http://api.wunderground.com/api/b28d047ca410515a/conditions/q/-33.912,151.013.json

код:

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

Однако я получаю исключение пытается извлечь из URL2 в соответствии с кодом ниже, это, кажется, более complica ted json, чтобы получить значения, любая помощь, пожалуйста?

// 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:

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

Какое исключение вы получаете? Пожалуйста, предоставьте реализацию 'getAtPath'. – dShringi

+0

Я получаю следующее исключение: вызвано: java.lang.IllegalStateException: не объект JSON: [{"date": {"epoch": "1459152000", "........... – Ossama

ответ

1

Проблема вы столкнулись, потому что есть проблема с getAtPath реализации.

[{"date":{"epoch":"1459152000"... представляет собой JSONArray, к которому метод пытается получить доступ как JSONObject. Следовательно, IllegalStateException.

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

удобный метод, чтобы получить этот элемент в качестве JSONObject. Если элемент имеет какой-то другой тип, это приведет к ошибке IllegalStateException. Следовательно, лучше всего использовать этот метод после того, как этот элемент имеет нужный тип , вызвав сначала isJsonObject().

Вы можете обновить и использовать что-то вроде ниже, так как теперь он возвращает только первый элемент.

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 mate, помогите noob поместить это в код PLS – Ossama

+0

Добро пожаловать. Пожалуйста, не забудьте принять ответ: P – dShringi

+0

thx, не забывайте, что мой вопрос тоже heheh – Ossama

0

Это должно работать:

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

нет работает, он бросает следующее исключение: вызвано: java.lang.IllegalStateException: не объект JSON: [{"date": {"epoch": "1459152000", "........... – Ossama

+1

Это потому, что возвращенный JSON является массивом. Можете ли вы также отправить метод getAtPath? – Milan

+0

Код getAtPath, добавленный выше. thx – Ossama