2014-09-30 3 views
-1

У меня есть ответ веб-службы Java как объект, который имеет карту с целым числом как ключ и пользовательский объект в качестве значения. Пользовательский объект, в свою очередь, состоит из списка другого настраиваемого объекта. Когда я пытаюсь десериализовать ответ, все десериализуется, за исключением списка настраиваемого объекта. Список пуст.Deserializing объект JSON в Java

Мой код:

String dataFromServer =""; 
GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 
Type listType = new TypeToken<OuterCustomResponse>() {}.getType(); 


OuterCustomResponse respo = gson.fromJson(data, Books.class); 

OuterCustomResponse имеет следующую структуру:

OuterCustomResponse { 
    private int age; 
    private String name; 
    private Map<Integer,CutomObj1> obj; 
} 

CtomObj1 { 
    List<CustomObj2> customObj2; 
} 

Проблема в ответ содержит возраст, имя и объект карты, но внутри объекта карты, список пустой. Я попытался написать десериализатор для CustomObj2, выполнив десериализатор JSON, но не использовал. Любая помощь приветствуется.

+0

Выполняет ли 'CustomObj1' класс' Serializable'? Возможно, если это не так, сериализовать его невозможно, и вы получите неправильный вывод. – Victor

+0

Я пробовал имплантировать srializablr в customobj1, не повезло. но customobj1 имеет другие атрибуты string и intgr, которые getd proprly. – parameswar

+0

Итак, ваша проблема связана только с 'CustomObj2'? Что у вас внутри? Это также «Serializable»? – Victor

ответ

0

Было бы лучше с некоторым примером JSON. (У вас есть опечатка там, я думаю, также CtomObj1 {...)

Возможно, customObj2 не объект, а не какой-то примитивный тип (? Маловероятно хорошо), или ваш список связан с массивом (= объект) У вас есть сложный объект вместо списка/массива?

Если это ассоциативный массив (~ объект) и выглядит как список:

OuterCustomResponse { 
    age:3, 
    name:"foo", 
    map:{ 
    1:{ 
     listitem1a:{...}, 
     listitem2a:{...}}, 
    2:{}, 
    ... 
}} 

вы, возможно, придется выбрать из этих 3 вариантов десериализовать обобщенно: https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types

Если это список действительно ((индексированный)):

OuterCustomResponse { 
    age:3, 
    name:"foo", 
    map:{ 
    1:[ 
     { listitem1propertyA: "bar" }, 
     { listitem2propertyB: "baz" } 
    ], 
    2:[], 
    ... 
}} 

элементы списка могут быть одного и того же или другого типа.

Если они одного типа, ваш подход должен работать, если listitem1propertyA правильно отображается на некотором поле CustomObj2.listitem1propertyA.

Если они не одного и того же типа (или может быть только один исключительный несоответствие объекта - я не знаю, приведет ли это к пустым спискам), вы должны выбрать один из указанных выше вариантов.