2013-07-16 2 views
1

У меня есть строковый вывод с сервера, и я пытаюсь извлечь некоторые значения из строки.преобразование строки в объект gson

Вот выход с сервера:

jsonString = 

{ 
    "MEANING":"reduce", 
    "DISPLAY":"", 
    "TYPE_CD":1, 
    "SELECTED_IND":1, 
    "CNT":1, 
    "SOURCES":[ 
       { "a":1 } 
      ] 
} 

Код:

JsonReader reader = new JsonReader(new StringReader(jsonString)); 
DataObject obj1 = new Gson().fromJson(reader, DataObject.class); 

DataObject Класс:

DataObject 
{ 
    private int MEANING; 
    private int CNT; 
    private String TYPE_CD; 
    private String DISPLAY; 
    private String MEANING; 
    private List<Long> SOURCES; 

    public String getSourceTypeMeaning() 
    { 
     return this.MEANING; 
    } 

    public String getSourceTypeDisplay() 
    { 
     return this.DISPLAY; 
    } 

    public String getSourceTypeCd() 
    { 
     return this.TYPE_CD; 
    } 

    public int getSourceCount() 
    { 
     return this.CNT; 
    } 

    public List<Long> getSourceList() 
    { 
     return this.SOURCES; 
    } 
} 

но получаю эту ошибку

Expected a string but was BEGIN_OBJECT at line 1 column 132 

Я не могу найти проблему с моим кодом.

ответ

1

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

Вы не можете использовать только Map для разбора SOURCES поле, потому что это поле действительно массив! У вас есть:

"SOURCES": [ ... ] 

Поскольку у вас есть квадратные скобки [ ], у вас есть массив! И это правда, что есть Map, но он содержится в массиве ...

Итак, что вам нужно, чтобы разобрать, что поле было правильно:

private List<Map<String, int>> SOURCES; 

Обратите внимание, что мы используем Map для позволяет содержание SOURCES иметь несколько и неизвестные значения, так что этот код может разобрать не только ваш JSON, но и что-то вроде:

"SOURCES":[ 
       { "a":1, "b":2 }, 
       { "c":3 }, 
       { "x":99, "y":98, "z":97 } 
      ] 
+0

Просьба, может ли нижестоящий объяснить причины нисходящего потока? – MikO

+0

+1 @Miko для исправления всех и да Источник - это список. –

0

SOURCES переменная должна быть Map<String,Long>, потому что в JSON строку SOURCES является сбор ключ-значение ("a":1) где «а» является строка и 1 номер.

Надеюсь, это поможет.

+0

Я изменил свой код, чтобы использовать HashMap, все еще получая сообщение об ошибке. private HashMap ИСТОЧНИКИ; public HashMap getSourceList() { return this.SOURCES; } По-прежнему появляется сообщение об ошибке «Ожидаемое BEGIN_ARRAY, но было BEGIN_OBJECT в строке 1» – user1772643

+0

-1, неправильный ответ: поле 'SOURCES' явно является массивом JSON, поскольку оно имеет квадратные скобки' [] '... – MikO

0

Проверить это

"SOURCES":[ 
       { "a":1 } 
] 

Это будет представлять собой список карты не Список долго.

Так что смените List<long> на List<Map<String, Long>> или List<Map<Object, Long>>.

+0

как ваш ответ отличается от ilya.stmn .. pls дон копия ответ .. –

+0

@shanku извините, но я не копировал ан. Когда я отправляю свои анкеты после этого, я вижу, что те же самые ans уже отправлены, и когда я начинаю писать, в настоящее время нет присутствующих. –

+0

-1, неправильный ответ: поле 'SOURCES' действительно представляет собой' List', так как оно имеет квадратные скобки '[]' ... – MikO

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