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

标签 java jackson json-deserialization

<分区>

我有这样一个类:

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

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

我如何告诉 Jackson 在遇到 CustomList 时它应该调用 ListUtils.createCustomList() 而不是构造函数?是否有混合配置,我可以指定从类型到构造方法的映射,或者我需要编写的自定义反序列化器?

最佳答案

这里有 2 个问题,第一个是如何告诉 Jackson 使用另一个类 ListUtils 的静态方法来创建 CustomList 类的实例。您可以在 CustomList 的静态方法上或通过混合使用 @JsonCreator。不幸的是,您不能在 ListUtils。有一个 open issue为了那个原因。

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

class ListDeserializer extends JsonDeserializer<CustomList> {
    @Override
    public CustomList deserialize(JsonParser p, DeserializationContext c) throws IOException {
        return ListUtils.createCustomList();
    }
}

使用其他初始化步骤扩展此方法,例如使用 JsonParser 解析元素并在返回之前将它们添加到列表中。查看示例 here .您可以指定要在 ObjectMapper 上没有任何注释的情况下使用此反序列化器:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(CustomList.class, new ListDeserializer());
mapper.registerModule(module);

关于java - 使用构建器方法作为构造函数反序列化外部库类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47496332/

相关文章:

java - 使用 Jackson 将 JSON 反序列化为 JPA 托管实体

java - 处理 Jackson 序列化的常见方法是什么

java - Jackson StdDeserializer 的自定义实例中 Autowiring Bean

java - 使用 GSON 序列化/反序列化 json/对象时的默认值

java - 没有Java反射的对象深度克隆

java - 在内部专用网络上保护 SOAP Web 服务的最佳方式是什么

java - 如何在没有列表名称的情况下使用 Jackson 序列化列表?

c# - 转换为 C# 中的对象列表时,Json 反序列化返回 null

java - 使用 java 8 从列表中获取子类的第一个实例

java - 查一下GSON的TypeToken是否包含List?