Использовать другой класс бинов в JSON Джексона, основанный на переменной? - PullRequest
2 голосов
/ 29 января 2011

У меня есть JSON, как показано ниже:

[{
  'kind':'1',
  'value1': 'foo',
  'value2': 'bar',
  ...
},
{
  'kind':'2',
  'value1': 'foo',
  'value2': 'bar',
  ...
}
..]

В основном список объектов с одинаковыми переменными. В моем коде я хотел бы создать ArrayList некоторого класса A, который бы содержал эти объекты. Однако я бы хотел, чтобы каждый объект имел подкласс One или Two, в зависимости от значения «kind».

Как мне это сделать?

Спасибо!

1 Ответ

1 голос
/ 29 января 2011

Это то, что Джексон называет «обработкой полиморфного типа». Есть хорошее объяснение того, как это сделать здесь . Вам нужно сказать Джексону, чтобы он вводил имя класса в JSON при его сериализации и использовал это имя класса при десериализации. Это делается с помощью аннотации:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
              include=JsonTypeInfo.As.PROPERTY, property="kind")

[Источник: @StaxMan (ниже).]

Если у вас нет контроля над форматом JSON, вы можете использовать Джексона, чтобы десериализовать его в некоторый общий промежуточный объект, а затем написать код, который создаст из него нужный объект подкласса. Либо используйте библиотеку json.org для десериализации строки JSON в org.json.JSONObject, а затем напишите код для создания нужных объектов на основе свойств JSONObject.

...