2017-02-07 4 views
0

я начинаю использовать Gson с Модернизированным, а не Джексоном, чтобы разобрать некоторые JSON из API Википедии, который структурированная так:Как разобрать объект JSON с Gson на карту неизвестного типа

{ 
    "batchcomplete": "", 
    "query": { 
    "pages": { 
     "21721040": { 
     "pageid": 21721040, 
     "ns": 0, 
     "title": "Stack Overflow", 
     "extract": "Stack Overflow 

В объект «pages», я пытаюсь сопоставить следующий блок с объектом Map типа ключа/значения String и WikiSummary, но объект возвращает null. Через Джексона, если я правильно помню, вы могли бы сделать прямое сопоставление, как это, так как я не знаю значений объектов, которые имеют «страницы» внутри него.

WikiPages.class

public class WikiPages { 

    public Map<String, WikiSummary> summaryMap; 

    public WikiPages(Map<String, WikiSummary> summaryMap) { 
     this.summaryMap = summaryMap; 
    } 

    public Map<String, WikiSummary> getSummaryMap() { 
     return summaryMap; 
    } 

    public void setSummaryMap(Map<String, WikiSummary> summaryMap) { 
     this.summaryMap = summaryMap; 
    } 

} 

WikiSummary

public class WikiSummary { 

    public int pageid; 
    public String title; 
    public String extract; 

    public WikiSummary(int pageid, String title, String extract) { 
     this.pageid = pageid; 
     this.title = title; 
     this.extract = extract; 
    } 

    public int getPageid() { 
     return pageid; 
    } 

    public void setPageid(int pageid) { 
     this.pageid = pageid; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getExtract() { 
     return extract; 
    } 

    public void setExtract(String extract) { 
     this.extract = extract; 
    } 
} 
+0

Поскольку ваши свойства json являются динамическими, самым простым решением было бы сделать страницы HashMap . Гсэн может разобрать это просто отлично. – whizzle

ответ

2

Вы, кажется, просто не нужно WikiPages, поскольку она должна быть сама карта (для простейшей конфигурации Gson; в противном случае необходим более сложный десериализатор). Поэтому Gson ищет свойство summaryMap, которого нет в данном JSON, и именно поэтому это null. Следующие отображения

final class WikiResponse { 
    @SerializedName("batchcomplete") 
    final String batchComplete = null; 
    @SerializedName("query") 
    final WikiQuery query = null; // this is what you seem to be looking for 
} 

final class WikiQuery { 
    @SerializedName("pages") 
    final Map<String, WikiSummary> pages = null; 
} 

final class WikiSummary { 
    @SerializedName("pageid") 
    final int pageId = Integer.valueOf(0); // can't be null, but a simple `0` literal will be inlined 
    @SerializedName("title") 
    final String title = null; 
    @SerializedName("extract") 
    final String extract = null; 
} 

может представлять JSON (при условии, DTOs выше входящих и не предназначены в качестве исходящего [в противном случае повышается], и Gson может назначить действительные значения для конечных полей). Разбор заданного JSON и запрос десериализованного POJO с wikiResponse.query.pages.get("21721040").title приведут к Stack Overflow.

+0

Фантастический! Это сработало. Я хотел сделать карту из моего содержимого WikiSummary, а не объекта «pages». – NotThatDroid

0
JSONObject pagesObject = queryObject.getJSONObject("pages"); 
Set<String> keys = pagesObject.keySet(); 
for (String k : keys) { 
    JSONObject desiredKeyValues = elements.getJSONObject(k); 
} 
+3

Не могли бы вы добавить некоторые детали с ответом? Thanks – Robert

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