2017-02-10 10 views
1

я получил набор потенциальных моделей реагирования JSON внутри класса-оболочки, такие как этот Dashboard пример:модель Gson десериализации внутри обертки

public class Dashboard { 

    @SerializedName("dashboard") 
    private List<Wrapper> wrappers; 

    public class Wrapper { 

     LocalDateTime updated; 

     SingleItemModel item; 

     ItemCollectionModel items; 

     //.... 

    } 
} 

public class ItemCollectionModel { 

     List<SingleItemModel> items; 

} 

Я пытаюсь заполнить эти поля из агрегированного JSON нескольких конечных точек API. Сокращенная форма выглядит примерно так:

{ 
    "dashboard": [ 
    { 
     "updated": "2017-02-08T05:42:52.451", 
     "items": {...} 
    }, 
     "updated": "2017-02-08T05:42:52.451", 
     "item": {...} 
    }, 
    .... 
    ] 
} 

У меня проблема, когда Gson не в состоянии создать POJO,. Если мое понимание верное, десериализация по умолчанию пытается сопоставить имя поля с ключом элемента JSON.

"items" : {} to ItemCollectionModel items 

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

Wrapper.items vs ItemCollectionModel.items 

десериализация Gson отлично работает, когда ответ API является единственным POJO, он рассматривает герметизирующий объект JSON как POJO и внутренние значения JSON совпадает с полями POJO. Но при попытке использовать Wrapper я получаю нулевые поля.

Как я могу убедиться, что поля Wrapper правильно десериализованы?

------------ UPDATE -------------

Простое решение смотрел мне в лицо. Использование списка объектов, на ответ jakubbialkowski, позволяет Gson десериализовать элементы. Хитрость заключалась в том, чтобы тогда вручную создать CollectionModel, чтобы инкапсулировать его, когда вызывается геттер для поля.

public ItemCollectionModel getItemCollectionModel() { 
    return new ItemCollectionModel(items); 
} 
+0

Вы можете создавать POJO, онлайн, чтобы передать ваши JSON. –

+0

Вы могли бы предоставить больше объяснений этому? – fakataha

+0

Чтобы создать правильную структуру pojo для gson из json, передайте свой ответ json на http://www.jsonschema2pojo.org/ этих ссылках и выберите тип источника: и стиль аннотации: с правой стороны. –

ответ

0

Попробуйте заменить:

ItemCollectionModel items; 

с:

List<SingleItemModel> items; 
+0

Вы правы, что это позволит Gson десериализовать ответ, но классы коллекций необходимы, чтобы определить тип отображения для отображения. – fakataha