2010-10-17 3 views
2

Я не могу решить, как десериализовать массив внутри объекта JSON, используя Gson. Объект JSON, что я пытаюсь десериализация выглядит следующим образом:Как можно десериализовать массив внутри объекта JSON?

{"item0":3, 
"item1":1, 
"item2":3, 
"array":[ 
    {"arrayItem1":321779321, 
    "arrayItem2":"asdfafd", 
    "arrayItem3":"asasdfadf"}]} 

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

public class Watchlist { 
private int itemn0; 
private int itemn1; 
private int itemn2; 
private Object array; 

} 

Но когда gson пытается десериализация массива он бросает исключение:

com.google.gson.JsonParseException: Type information is unavailable, and the target object is not a primitive: <my gson array> 

Может кто-нибудь, пожалуйста, скажите мне, как десериализовать это?

+0

Можете ли вы показать нам свой код, который бросает это исключение? –

+0

Код, который генерирует исключение, - это просто звонок от Json Список наблюдения: список = gson.fromJson (jsonResponse, Watchlist.class); – limmy

ответ

0

Там есть несколько проблем здесь:

Один из них, я не думаю, что вы используете массив, как вы думаете. У вас есть «arrayItem1» до 3, но они содержатся в одном объекте JSON внутри массива ... поэтому на самом деле массив имеет только один элемент.

Массив должен, вероятно, будет что-то вроде:

"array": [ 
    321779321, 
    "asdfafd", 
    "asasdfadf" 
] 

Во-вторых, тип array в классе Java является Object ... что не дает никакой информации Gson типа использовать для перевода объект. Обычно вы хотите объявить тип объекта, который массив отображает как List<String> или List<Integer>, или некоторые из них. Это дает необходимую информацию о типе ... массив JSON может отображать на List, а параметр типа String сообщает, какой тип переводит содержимое массива в.

Проблема с массивом в вашем примере состоит в том, что он не является однородным ... в нем есть число и две строки. Как правило, следует избегать подобных типов в массиве/коллекции. Вы можете, однако, объявить тип вашего array объекта как List<String> ... вы просто получите форму номера String.

+0

Ах да. Спасибо что подметил это. Ты прав. Этот массив имеет только 1 элемент. Лучшим примером был бы: { "item0": 3, "элемент1": 1, "элемент2": 3, "массив": [ { "arrayItem1": 321779321, "arrayItem2":» asdfafd», "arrayItem3": "asasdfadf"}, { "arrayItem1": 234, "arrayItem2": "asdfafd", "arrayItem3": "asdfa"}]} – limmy

+0

ColinD, спасибо за объяснение. Основываясь на том, что вы сказали, мне удалось заставить этот код работать, преобразовывая мой массив в List >. , но мне было интересно, могу ли я преобразовать это в список ? Разве это невозможно вообще на основе вашего объяснения? Спасибо. – limmy

+0

Да, если вы определили класс, который имеет поля, соответствующие полям объектов JSON в вашем массиве ('MyObject'), и объявите поле массива как« Список ', это будет работать нормально! – ColinD

1

Ваш «массив» - это массив. так в классе WatchList

public class Watchlist { 
    private int itemn0; 
    private int itemn1; 
    private int itemn2; 
    private List<watchListarray> array; 

//constructor 
    //getter & setter of all 

} 

now watchListarray class 
public class watchListarray{ 
    String arrayItem1=""; 
    String arrayItem2=""; 
    String arrayItem3=""; 
//constructor 
//getter & setters of all 
} 

Теперь с помощью загрузки Gson относятся: http://primalpop.wordpress.com/2010/06/05/parsing-json-using-gson-in-android/