2015-11-17 3 views
0

Я изо всех сил пытаюсь разобрать объект JSON с переменным содержимым для Java-объекта.Gson/Retrofit parse variable JSON

Обычно я пытаюсь сопоставить объект JSON с POJO, однако в этом случае я не знаю, что делать.

My JSON выглядит следующим образом:

"parts": [ 
      [ 
      "text", 
      "http://www.example.com/" 
      ], 
      [ 
      "page", 
      [ 
       "http://www.example.com/", 
       "\n\t\n\t\t\n\t\t\tSome of the Page Content preview here...", 
       "", 
       "/path/to/picture.jpg" 
      ] 
      ], 
      [ 
      "text", 
      "Another String here " 
      ] 
     ] 

Запуск этого куска коды корыто типичного Json на Java конвертера объектов не работает, потому что это не может быть сопоставлено с простым POJO.

Я попытался преобразования в List<List<String>>> myObject;, но, как ожидается, это дает мне исключение:

W: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 9563 path $[3]./object.parts[1][1] 

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

Любая помощь, направленная мне в хорошем направлении, была бы весьма признательна.

EDIT: Как указано в комментариях, данные JSON поставляются не в правильной форме пары значений ключа. Я связался с поставщиками API, и они разобрались.

До тех пор, пока я не столкнусь с проблемой решения этой проблемы на интерфейсе, я оставлю этот вопрос открытым.

+0

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

+0

Можете ли вы просто преобразовать его в LinkedHashMap/ArrayLists с gson? – Bill

ответ

0

Таким образом, после глядя на эту проблему еще раз после того, как аф несколько дней, я, наконец, нашел решение, которое работает для моего дела!

Вместо того, чтобы пытаться проанализировать элемент в String, как в моих первых попытках.Я теперь хранить данные в простой java.lang.Object

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

@SerializedName("parts") 
@Expose 
private List<List<Object>> parts = new ArrayList<List<Object>>(); 

Это предотвращает процесс разбора GSON от сбоя приложения, когда инвалид массив обнаружен.

При попытке получить доступ к данным, теперь я проверяю, имеет ли объект тип String, если это так, я продолжаю, игнорируя все массивы.

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

List<List<Object>> partList = myParsedObject.getParts(); 
    if (partList.size() > 0) { 
     if (partList.get(0).size() > 1) { 
      if (partList.get(0).get(1) instanceof String) { 
       return partList.get(0).get(1).toString(); 
      } 
     } 
    } 
0

Второй элемент во втором элементе массива также является массивом в JSON, который вы опубликовали.

Поскольку GSON ожидает список списков строк, он не может проанализировать документ, начинающийся с этой точки.

"parts": [ 
     ..., 
     [ 
     "page", 
     [ <--- Problematic array begin 
      "http://www.example.com/", 
      "\n\t\n\t\t\n\t\t\tSome of the Page Content preview here...", 
      "", 
      "/path/to/picture.jpg" 
     ] 
     ], 
     ... 
    ] 
+0

Я понимаю, что это проблема, однако я ищу обходной путь для получения информации. Любые предложения по этому поводу? – RWIL

+0

У вас есть документ JSON? Этот документ не очень хорошо использует структуры, доступные вам в JSON. – rmlan

+0

К сожалению, это то, с чем я должен работать API. – RWIL

0

Ваш JSON не хорошо отформатирован, я попытался проверить свой размещенный на JSON в Online JSON Formatter и он не может разобрать ваш JSON. Вам необходимо инкапсулировать, что JSON в фигурные скобки, например:

{"parts": [ 
     [ 
     "text", 
     "http://www.example.com/" 
     ], 
     [ 
     "page", 
     [ 
      "http://www.example.com/", 
      "\n\t\n\t\t\n\t\t\tSome of the Page Content preview here...", 
      "", 
      "/path/to/picture.jpg" 
     ] 
     ], 
     [ 
     "text", 
     "Another String here " 
     ] 
    ] 
} 

Это JSON будет успешно проанализирован с помощью онлайн JSON Formatter, и вы должны быть в состоянии разобрать его просто отлично. Проблема в том, что вам нужно работать над множеством JSON Array, который не имеет key, чтобы идентифицировать их. Картирование было бы неприятным из-за JSON Array после строки "page".

Если мой предложенный JSON можно сопоставить с POJO List<List<String>>, вам нужно будет получить второй элемент и вручную проанализировать его снова, так как у второго массива все еще есть массив внутри него.

Надеюсь, это поможет и удачи !!!

С уважением,

Reid