У меня есть объект, который использует 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 для определенного типа, не будет адекватно отвечать на этот вопрос.
Вы должны включить текст с благодарностью на вопрос, поскольку он имеет отношение к правильному ответу на него. –
Невозможно сделать это на 100% совместимым со всем. Поскольку данные теряются, вы должны сделать предположения, такие как реализация списка поддержки LazyList и фабрика. Единственный способ сделать это, не делая этих предположений, - это как-то добавить эту информацию в сериализованный JSON. Вы можете написать свой собственный сериализатор, чтобы использовать отражение, чтобы добавить эту информацию, и десериализатор, чтобы использовать эту информацию (опять же, используя отражение), создает объект LazyList, но вы все еще делаете предположения, например, что ваши фабрики имеют конструкторы 0-arg. –
Сделайте поиск google для «java reflection» и используйте это, чтобы получить защищенные переменные 'collection' и' factory' для вашего сериализатора и конструкторы для вашего десериализатора. Или посмотрите другие вопросы о помощи, например: http://stackoverflow.com/questions/735230/java-reflection –