2013-11-24 7 views
0

У меня есть List<List<Integer>> со значениемJava Gson разобрать не десериализации правильно

[[537316070],[306297332],[319303159],[538639811],[528406093],[166705854],[124574525],[967403337],[569514785],[304831454],[219384921],[308948513],[355538394],[297996417]] 

после сериализации с Gson.

Когда я десериализации его с помощью

List<List<Integer>> data = (List<List<Integer>>) GsonParser.gson.fromJson(datastr, List.class); 

Я получаю

[[5.3731607E8], [3.06297332E8], [3.19303159E8], [5.38639811E8], [5.28406093E8], [1.66705854E8], [1.24574525E8], [9.67403337E8], [5.69514785E8], [3.04831454E8], [2.19384921E8], [3.08948513E8], [3.55538394E8], [2.97996417E8]] 

Кто-нибудь знает, что случилось?

Благодаря

+0

Я предполагаю, что из-за стирания типа он компилируется нормально, но на самом деле он должен давать исключение Runtime Exception, но JVM не может его обнаружить. Я предполагаю, что процесс сериализации/десериализации преобразует его в двойные. –

+0

JSON не знает разницы между целым числом и поплавком, и, следовательно, у парсеров нет подсказок. Таким образом, они будут стремиться втиснуть длинный int в двойной. Я столкнулся с этой проблемой на iPhone. –

+0

Какое решение? Должен ли я просто хранить его как строки вместо ints? – omega

ответ

2

Gson, по умолчанию, разбирает любой JSON число в double. Это происходит в методе ObjectTypeAdapter#read(JsonReader):

... 
case NUMBER: 
    return in.nextDouble(); 
... 

Выполните следующие действия

List<List<Integer>> data = GsonParser.gson.fromJson(json, new TypeToken<List<List<Integer>>>() {}.getType()); 

, чтобы получить их в качестве Integer экземпляров.

TypeToken - это Java-хак, чтобы получить фактические общие типы параметров. javadoc

Создает новый тип литерала. Производные представляют класс из типа .

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

+0

Это отлично поработало, спасибо. – omega

+0

Конечно, что ДОЛЖНО сделать, чтобы сделать все число Числа и выбрать соответствующий подкласс числа, основанный на символьных данных, но, по-видимому, это не делается. –

+0

@hotLicks Я не согласен. Каков соответствующий подкласс «Номер»? –

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