2015-07-06 4 views
0

У меня возникли проблемы с разбором JSON для Java-класса с использованием GSON. Вот JSON:Разбор JSON для Java-класса с Gson

{ 
    "results": { 
     "searchCriteria": { 
      "start": "2002-01-01", 
      "end": "2015-07-06", 
      "query": "test", 
      "lat": "45.9511", 
      "lon": "1.4063", 
      "population": 5000, 
      "popop": ">", 
      "range": 50000 
     }, 
     "citiesDetailed": [{ 
      "lon": 0.90143, 
      "weight": 1, 
      "count": 1, 
      "name": "Saint-Junien", 
      "lat": 45.88867 
     }, 
     { 
      "lon": 1.2578, 
      "weight": 1, 
      "count": 405, 
      "name": "Limoges", 
      "lat": 45.83153 
     }, 
     { 
      "lon": 1.21213, 
      "weight": 10, 
      "count": 25789, 
      "name": "Isle", 
      "lat": 45.80272 
     }, 
     { 
      "lon": 1.86667, 
      "weight": 1, 
      "count": 400, 
      "name": "Gueret", 
      "lat": 46.16667 
     }, 
     { 
      "lon": 1.40063, 
      "weight": 1, 
      "count": 2, 
      "name": "Ambazac", 
      "lat": 45.95983 
     }] 

    } 
} 

И вот мои занятия.

Results.java

package com.test.classes; 

import java.util.List; 

public class Results{ 
    private List citiesDetailed; 
    private SearchCriteria searchCriteria; 

    public List getCitiesDetailed(){ 
     return this.citiesDetailed; 
    } 
    public void setCitiesDetailed(List citiesDetailed){ 
     this.citiesDetailed = citiesDetailed; 
    } 
    public SearchCriteria getSearchCriteria(){ 
     return this.searchCriteria; 
    } 
    public void setSearchCriteria(SearchCriteria searchCriteria){ 
     this.searchCriteria = searchCriteria; 
    } 
} 

SearchCriteria.java

package com.test.classes; 

public class SearchCriteria{ 
    private String end; 
    private String lat; 
    private String lon; 
    private String popop; 
    private Number population; 
    private String query; 
    private Number range; 
    private String start; 

    public String getEnd(){ 
     return this.end; 
    } 
    public void setEnd(String end){ 
     this.end = end; 
    } 
    public String getLat(){ 
     return this.lat; 
    } 
    public void setLat(String lat){ 
     this.lat = lat; 
    } 
    public String getLon(){ 
     return this.lon; 
    } 
    public void setLon(String lon){ 
     this.lon = lon; 
    } 
    public String getPopop(){ 
     return this.popop; 
    } 
    public void setPopop(String popop){ 
     this.popop = popop; 
    } 
    public Number getPopulation(){ 
     return this.population; 
    } 
    public void setPopulation(Number population){ 
     this.population = population; 
    } 
    public String getQuery(){ 
     return this.query; 
    } 
    public void setQuery(String query){ 
     this.query = query; 
    } 
    public Number getRange(){ 
     return this.range; 
    } 
    public void setRange(Number range){ 
     this.range = range; 
    } 
    public String getStart(){ 
     return this.start; 
    } 
    public void setStart(String start){ 
     this.start = start; 
    } 
} 

CitiesDetailed.java

package com.test.classes; 

public class CitiesDetailed{ 
    private Number count; 
    private Number lat; 
    private Number lon; 
    private String name; 
    private Number weight; 

    public Number getCount(){ 
     return this.count; 
    } 
    public void setCount(Number count){ 
     this.count = count; 
    } 
    public Number getLat(){ 
     return this.lat; 
    } 
    public void setLat(Number lat){ 
     this.lat = lat; 
    } 
    public Number getLon(){ 
     return this.lon; 
    } 
    public void setLon(Number lon){ 
     this.lon = lon; 
    } 
    public String getName(){ 
     return this.name; 
    } 
    public void setName(String name){ 
     this.name = name; 
    } 
    public Number getWeight(){ 
     return this.weight; 
    } 
    public void setWeight(Number weight){ 
     this.weight = weight; 
    } 
} 

И я просто использую это для разбора его (String JSON равно JSON выше):

Gson gson = new Gson(); 
Results r = gson.fromJson(json, Results.class); 

System.out.println("Query: " + r.getSearchCriteria().getQuery()); 

Это приводит к исключению NullPointerException, поэтому я четко указываю, что мое сопоставление находится где-то. Я не могу понять, где.

+0

какая линия бросает NPE? –

ответ

1

Проблема заключается в том, что у вашего json только одна запись в ней называется результатов, так что вы один слой, который не способен правильно его разобрать.

Вам необходимо создать класс для хранения возвращаемого объекта Results и использовать Gson для анализа вашего json в , который.

Например, вы можете создать ResultWrapper.java так:

public class ResultWrapper { 
    Results results; 

    public Results getResults() { 
     return results; 
    } 

    public void setResults(Results results) { 
     this.results = results; 
    } 
} 

... затем сделайте свой синтаксический анализ кода выглядеть следующим образом:

Gson gson = new Gson(); 
    ResultWrapper rw = gson.fromJson(json, ResultWrapper.class); 
    System.out.println("Query: " + rw.getResults().getSearchCriteria().getQuery()); 

... и вы получите выход как так:

Запрос: тест

+0

А, да. В этом есть смысл. Я также могу отказаться от «результатов» уровня JSON, верно? – ev0lution37

+0

Да, вы также можете переместить данные (searchCriteria, citiesDetailed) до корневого уровня и проанализировать всю вещь как «Результат». Вам просто нужно, чтобы глубина вложенности объектов соответствовала глубине вложенности строки json. – azurefrog

+0

Отлично. Это сделал трюк. Благодаря! – ev0lution37

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