我有这样一个类:
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);