2013-06-28 4 views
5

У меня есть объект, который использует org.apache.commons.collections.list.LazyList для одного из своих полей, который сериализован ti JSON. JSON выглядит следующим образом:deserialize lazylist using jackson

 "myObject": ["org.apache.commons.collections.list.LazyList", [ 
      { 
       "attr1": "asdasd", 
       "attr2": 1234 
      } 
     ]], 

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

List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory) 

Однако пытаясь десериализации выше JSON с помощью Джексон ObjectMapper не удается, так как он не может найти конструктор по умолчанию для LazyList - это имеет смысл. Но как я могу указать, как это поле можно десериализовать?

Сообщение об ошибке:

конструктор по умолчанию не для [Тип сбора; класс org.apache.commons.collections.list.LazyList, содержит [простой тип, класс foo.bar.MyObject]]

Баунти-ограничения:

Собирать Баунти, этот вопрос требует для ответа с использованием специального десериализатора джексона - пользовательский десериализатор не должен быть полевым! Следовательно, никакое решение, использующее пользовательские реализации LazyList для определенного типа, не будет адекватно отвечать на этот вопрос.

+0

Вы должны включить текст с благодарностью на вопрос, поскольку он имеет отношение к правильному ответу на него. –

+0

Невозможно сделать это на 100% совместимым со всем. Поскольку данные теряются, вы должны сделать предположения, такие как реализация списка поддержки LazyList и фабрика. Единственный способ сделать это, не делая этих предположений, - это как-то добавить эту информацию в сериализованный JSON. Вы можете написать свой собственный сериализатор, чтобы использовать отражение, чтобы добавить эту информацию, и десериализатор, чтобы использовать эту информацию (опять же, используя отражение), создает объект LazyList, но вы все еще делаете предположения, например, что ваши фабрики имеют конструкторы 0-arg. –

+0

Сделайте поиск google для «java reflection» и используйте это, чтобы получить защищенные переменные 'collection' и' factory' для вашего сериализатора и конструкторы для вашего десериализатора. Или посмотрите другие вопросы о помощи, например: http://stackoverflow.com/questions/735230/java-reflection –

ответ

1

Решение ниже работает как с объектами коллекции List, так и с Map, оно также может работать на вашем.

@JsonDeserialize(contentAs=MyObject.class) 
private List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory);