GSON Dynamic Class Binding - PullRequest
       6

GSON Dynamic Class Binding

1 голос
/ 29 ноября 2011

В настоящее время я использую GSON для анализа моего JSON-объекта. Я использовал стандартный способ, как:

Result response= gson.fromJson(reader, Result.class);

Результатом может быть очень сложный объект с другими сложными объектами, до 5 уровней сложных объектов. Но у меня нет проблем с этим. Мой вопрос: я хотел бы иметь в некоторых объектах атрибут с гибким типом.

Например:

class Class1 {
    String hello;
}

class Class2 {
    String world;
}

class Class3 {
    Class<?> (= class1 or class2) hello;
}

// Parsing time
Class<?> response= gson.fromJson(reader, Class3.class);
try {
    Class1 ret = (Class1)response;
} catch ... {
    Class2 ret = (Class2)response;
}

Надеюсь, это достаточно ясно.

1 Ответ

5 голосов
/ 29 ноября 2011

К сожалению, последняя версия Gson (2.0) по-прежнему не имеет встроенной поддержки для простой конфигурации, обеспечивающей полиморфную десериализацию.Таким образом, если нужно использовать Gson (вместо API, который имеет такую ​​встроенную поддержку, как Jackson ) - используя который я опубликовал полные примеры полиморфной десериализации на http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html),, тогда пользовательскийобработка десериализации необходима.

Для десериализации до полиморфных типов в JSON должно присутствовать что-то, чтобы определить, к какому конкретному типу следует десериализоваться.предназначенный именно для этой цели, где код десериализации выбирает правильный тип на основе значения элемента специального назначения, например:

{"type":"Class1","hello":"Hi!"} --> deserializes to Class1 instance
{"type":"Class2","world":"Earth"} --> deserializes to Class2 instance

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

См. Gson, выпуск 231 , для получения дополнительной информации по этой теме.как возможная информация о том, когда встроенная полиморфная установка десериализации может быть включена в Gs

Еще один пост на StackOverflow.com с примером полиморфной десериализации с помощью Gson: Полиморфизм с помощью gson

...