使用Jackson反序列化LazyList

5

我有一个对象,其中一个字段使用了org.apache.commons.collections.list.LazyList,它被序列化为JSON。JSON的格式如下:

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

对象字段看起来像这样:
List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory)

然而,尝试使用Jackson ObjectMapper反序列化上述JSON会失败,因为它找不到LazyList的默认构造函数 - 这是有道理的。但是我该如何指定如何反序列化此字段呢?
错误信息:
没有默认构造函数[集合类型;类org.apache.commons.collections.list.LazyList,包含[简单类型,类foo.bar.MyObject]]
赏金限制:
为了收集赏金,必须使用自定义的Jackson反序列化器来回答此问题 - 自定义反序列化器不能是特定于字段的! 因此,没有使用LazyList的特定类型的自定义实现解决此问题。

你应该在问题中包含悬赏文本,因为它与正确回答问题相关。 - Peter O.
无法使其与所有内容完全兼容。由于数据丢失,您必须做出一些假设,例如LazyList的支持列表实现和工厂。唯一的方法是在序列化JSON中以某种方式添加该信息,而不进行这些假设。您可以编写自己的序列化程序来使用反射添加该信息,并编写反序列化程序来使用该信息(再次使用反射)创建LazyList对象,但仍然会做出假设,例如您的工厂具有0个参数的构造函数。 - Shadow Man
在谷歌上搜索“java反射”,并使用它来获取您的序列化器的受保护的“collection”和“factory”变量以及您的反序列化器的构造函数。或者查看其他问题以获取帮助,例如:https://dev59.com/v3RB5IYBdhLWcg3wEDql - Shadow Man
1个回答

1
以下解决方案适用于列表和映射集合对象,也可能适用于您的对象。
@JsonDeserialize(contentAs=MyObject.class)
private List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接