Разбор JSON с GSON, объект иногда содержит список, иногда содержит объект
5409 просмотра
1 ответ
Я работаю с API, который иногда содержит список дочерних объектов:
{ 'obj' : { children: [ {id: "1"}, {id: "2"} ] } }
Я не могу разобрать это без проблем. Но если есть только один ребенок, он не возвращает его в виде списка:
{ 'obj' : { children: {id: "1"} } }
Мой парсер, который ожидает список, затем ломается. У кого-нибудь есть предложения как с этим бороться?
Автор: ufmemo Источник Размещён: 12.11.2019 09:22Ответы (1)
16 плюса
Решение
С Gson я знаю, как справляться с подобными ситуациями, только с помощью специального десериализатора. Например:
// outputs:
// [Container: obj=[ChildContainer: children=[[Child: id=1], [Child: id=2]]]]
// [Container: obj=[ChildContainer: children=[[Child: id=1]]]]
public class Foo
{
static String json1 = "{\"obj\":{\"children\":[{\"id\":\"1\"},{\"id\":\"2\"}]}}";
static String json2 = "{\"obj\":{\"children\":{\"id\":\"1\"}}}";
public static void main(String[] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(Child[].class, new ChildrenDeserializer());
Gson gson = gsonBuilder.create();
Container container1 = gson.fromJson(json1, Container.class);
System.out.println(container1);
Container container2 = gson.fromJson(json2, Container.class);
System.out.println(container2);
}
}
class Container
{
ChildContainer obj;
@Override
public String toString()
{
return String.format("[Container: obj=%1$s]", obj);
}
}
class ChildContainer
{
Child[] children;
@Override
public String toString()
{
return String.format("[ChildContainer: children=%1$s]", Arrays.toString(children));
}
}
class Child
{
String id;
@Override
public String toString()
{
return String.format("[Child: id=%1$s]", id);
}
}
class ChildrenDeserializer implements JsonDeserializer<Child[]>
{
@Override
public Child[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
if (json instanceof JsonArray)
{
return new Gson().fromJson(json, Child[].class);
}
Child child = context.deserialize(json, Child.class);
return new Child[] { child };
}
}
Автор: Programmer Bruce
Размещён: 03.06.2011 10:29
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- java Библиотека Java SWIFT
- java Выключение компьютера
- java Как я могу воспроизвести звук на Java?
- java Когда выбирать отмеченные и непроверенные исключения
- gson Как я могу преобразовать JSON в HashMap с помощью Gson?
- gson Gson и десериализация массива объектов с массивами в нем
- gson Gson: Непосредственно конвертировать String в JsonObject (без POJO)
- gson Gson: Как исключить определенные поля из сериализации без аннотаций
- gson Google Gson - десериализовать список <class> объект? (универсальный тип)
- gson Полиморфизм с гсоном
- gson Разбор JSON с GSON, объект иногда содержит список, иногда содержит объект
- gson Gson Java зарезервированное ключевое слово
- gson Как сохранить последовательность полей в сериализации Gson
- gson Десериализация родовых коллекций с помощью Gson