如何让杰克逊反序列化到我自己的Array实现中

tyr*_*dis 8 java json jackson json-deserialization

鉴于我自己的数组实现MyArray<T>,如何让Jackson知道它,以便它能够从JSON数组反序列化为MyArray<T>?到目前为止,我只得到这个例外:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of MyArray out of START_ARRAY token
Run Code Online (Sandbox Code Playgroud)

Mac*_*ski 3

Array正如 Dariusz 提到的,利用类具有接受普通数组的构造函数这一事实是很好的。

看,如果您使用默认序列化程序 - 序列化为 JSON 的数组将如下所示:

{"items":["item1","item2"],"size":2,"ordered":true}
Run Code Online (Sandbox Code Playgroud)

这显然是浪费空间,除非你想保留字段sizeordered

我建议您更改序列化对象的方式,使其看起来更像普通数组,但另一方面 - 反序列化可以Array再次构建对象。

如果添加以下一对序列化器和反序列化器:

SimpleModule module = new SimpleModule();
module.addDeserializer(Array.class, new StdDelegatingDeserializer<>(
    new StdConverter<Object[], Array>() {
        @Override
        public Array convert(Object[] value) {
            return new Array(value);
        }
}));

module.addSerializer(Array.class, new StdDelegatingSerializer(
    new StdConverter<Array, Object>() {
        @Override
        public Object convert(Array value) {
            return value.toArray();
        }
}));

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
Run Code Online (Sandbox Code Playgroud)

您将在这些类型之间进行透明的转换