【问题标题】:deserialize lazylist using jackson使用杰克逊反序列化惰性列表
【发布时间】:2013-06-26 07:45:37
【问题描述】:

我有一个对象,它使用org.apache.commons.collections.list.LazyList 作为它的一个字段,它是序列化的 ti 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 的默认构造函数 - 这是有道理的。但是如何指定如何反序列化该字段?

错误信息:

[collection type; 没有默认构造函数; org.apache.commons.collections.list.LazyList 类,包含[简单类型,类 foo.bar.MyObject]]

赏金限制:

要收集赏金,需要使用自定义杰克逊反序列化器来回答这个问题 - 自定义反序列化器不能是特定于字段的!因此,对于特定类型使用 LazyList 的自定义实现的任何解决方案都无法充分回答这个问题。

【问题讨论】:

  • 您应该在问题中包含赏金文本,因为它与正确回答有关。
  • 没有办法让这个 100% 兼容一切。由于数据丢失,你必须做出假设,例如 LazyList 的后备 List 实现和工厂。在不做这些假设的情况下做到这一点的唯一方法是以某种方式将该信息添加到序列化的 JSON 中。您可以编写自己的序列化程序以使用反射来添加该信息,并使用反序列化程序使用该信息(同样,使用反射)创建 LazyList 对象,但您仍在做出假设,例如您的工厂具有 0-arg 构造函数。
  • 在谷歌上搜索“java反射”并使用它来获取受保护的collectionfactory 用于您的序列化程序和反序列化程序的构造函数的变量。或查看其他问题寻求帮助,例如:stackoverflow.com/questions/735230/java-reflection

标签: json jackson deserialization lazylist


【解决方案1】:

以下解决方案适用于 List 和 Map 集合对象,它也可能适用于您的。

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

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2017-12-09
    • 2014-08-13
    相关资源
    最近更新 更多