2015-06-11 5 views
1

Я пытаюсь получить информацию о погоде от API Yahoo. Это мой JSON:Gson не десериализует данные JSON

JSON

Это мой DTO:

public class forecast implements Serializable { 

private static final long serialVersionUID = -520652416977871134L; 
private String text; 
private String high; 
private String day; 
private String code; 
private String low; 
private String date; 

public forecast() { 
} 


public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public String getHigh() { 
    return high; 
} 

public void setHigh(String high) { 
    this.high = high; 
} 

public String getDay() { 
    return day; 
} 

public void setDay(String day) { 
    this.day = day; 
} 

public String getCode() { 
    return code; 
} 

public void setCode(String code) { 
    this.code = code; 
} 

public String getLow() { 
    return low; 
} 

public void setLow(String low) { 
    this.low = low; 
} 

public String getDate() { 
    return date; 
} 

public void setDate(String date) { 
    this.date = date; 
} 

@Override 
public String toString() { 
    return "ClassPojo [text = " + text + ", high = " + high + ", day = " 
      + day + ", code = " + code + ", low = " + low + ", date = " 
      + date + "]"; 
} 
} 

Я заинтересован только для forecast элемента.

Когда я пытаюсь прочитать данные, де-сериализованные в мой DTO, все они равны нулю. Я чувствую, что я не отформатировал свой DTO должным образом.

Кроме того, что такое правильный способ сопоставления JSON с POJO?

EDIT: это мой код для десериализации

String endpoint = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20" 
      + "where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22Rhodes%2C%20Gr%22)&" 
      + "format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 
    try { 
     URL endpointURL = new URL(endpoint); 
     HttpURLConnection connection = (HttpURLConnection) endpointURL 
       .openConnection(); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     JsonReader reader = new JsonReader(new InputStreamReader(input)); 
     reader.setLenient(true); 
     forecast response = new Gson().fromJson(reader, 
       forecast.class); 
     Log.d("forecast", response.toString());//override toString() to return all the values of the object 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+2

Где ваш код для использования GSON? –

+0

Добавлен код, в котором я использую GSON –

+0

Как вы вызываете 'Gson'? Поскольку «прогноз» является одним из внутренних элементов, и это массив объектов, вы не можете просто игнорировать все остальное и получать один экземпляр «прогноз» непосредственно из JSON. – m4ktub

ответ

1

Ваш JSON (который вы получите от Yahoo) является очень сложным. Поэтому его нельзя легко сопоставить с простым POJO (но вы все равно можете написать огромное POJO, которое содержит поля для всех соответствующих вложенных элементов JSON).

Но можно разбирать и извлекать определенные элементы из JSON.

Код:

public static void main(String[] args) { 
    String endpoint = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20" 
      + "where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22Rhodes%2C%20Gr%22)&" 
      + "format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 
    try { 
     URL endpointURL = new URL(endpoint); 
     HttpURLConnection connection = (HttpURLConnection) endpointURL 
       .openConnection(); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     JsonReader reader = new JsonReader(new InputStreamReader(input)); 
     reader.setLenient(true); 

     JsonElement forecastSubObject = new JsonParser().parse(reader). 
       getAsJsonObject().get("query"). 
       getAsJsonObject().get("results"). 
       getAsJsonObject().get("channel"). 
       getAsJsonObject().get("item"). 
       getAsJsonObject().get("forecast"); 

     System.out.println(forecastSubObject.toString()); 

     List<forecast> forecasts = (List<forecast>)new Gson().fromJson(forecastSubObject, List.class); 

     System.out.println("forecast : " + forecasts); 
     System.out.println("first forecast: " + forecasts.get(0));  
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Использование JsonParser вы можете пройти через элементы (по ихним именам). Когда элемент «прогноз» достигнут, соответствующая строка извлекается. Затем он анализируется как обычный объект и отображается в список вашего прогноза POJO.

Вообще говоря, отображение в/из JSON - очень широкая сфера. Различные библиотеки предоставляют разные способы достижения этого (от простого и грязного до сложного, но надежного).

+0

Спасибо за ваш ответ @ flaz14. Позвольте мне попробовать это и вернуться к вам. –

+0

Ну, мне нужен только элемент прогноза, поэтому я попытался «getAsJsonObject(). Get (« прогноз »), но все же объект« null ». Есть идеи по этому поводу? Я также заметил, что «прогноз» представляет собой массив, но GSON api не согласен со мной, бросая исключение, говоря, что это не массив. –

+1

Я редактировал код. Таким образом, весь массив прогнозируемого POJO загружается 'List projects = (Список ) new Gson(). FromJson (прогнозSubObject, List.class);' загружает этот массив. Затем любой желаемый элемент можно взять из списка «прогнозы». – flaz14

Смежные вопросы