使用构建器方法将外部库类反序列化为构造函数

时间:2017-11-26 12:52:10

标签: java jackson json-deserialization

我有一个这样的课程:

class MyClass {
    CustomList<String> list = ListUtils.createCustomList();
}

interface CustomList implements java.util.List,因此无法使用构造函数进行反序列化。相反,有一个class ListUtils创建一个实现实例。接口和实用程序类都在外部库中,因此我无法对它们进行注释。

我怎么能告诉杰克逊遇到CustomList时应该调用ListUtils.createCustomList()而不是构造函数?是否有mixin配置,我可以从类型到构造方法指定的映射,或者我需要编写的自定义反序列化器?

1 个答案:

答案 0 :(得分:1)

这里有2个问题,第一个问题是如何告诉Jackson使用另一个类ListUtils的静态方法来创建CustomList类的实例。您可以@JsonCreator使用静态方法CustomList或混合使用ListUtils。不幸的是,您无法在class ListDeserializer extends JsonDeserializer<CustomList> { @Override public CustomList deserialize(JsonParser p, DeserializationContext c) throws IOException { return ListUtils.createCustomList(); } } 上使用它。有一个open issue

在实现/发布上述请求之前,您必须创建自定义反序列化程序。这种反序列化器的骨架实现看起来像这样:

JsonParser

使用其他初始化步骤扩展此方法,例如使用ObjectMapper解析元素并在返回之前将它们添加到列表中。查看示例here。您可以在ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(CustomList.class, new ListDeserializer()); mapper.registerModule(module);

上指定此反序列化器,而无需任何注释
IDistributedCache