Jackson -序列化时忽略Map超类

cbwuti44  于 2022-11-09  发布在  其他
关注(0)|答案(4)|浏览(194)

我有几个扩展LinkedHashMap<String, Object>的模型类:它们定义了 Package Map的get和put方法的getter和setter。我尝试使用Jackson序列化这些类的示例(使用RESTEasy),但是Jackson拒绝关注我的getter(用@JsonProperty注解),相反,它只是序列化支持Map的键-值对。但这并没有改变什么,有没有办法阻止Jackson自动序列化Map,或者我必须创建不扩展LinkedHashMap<String, Object>的新模型类?

sxissh06

sxissh061#

我同意@skaffman的回答。但是如果你不能轻易地彻底改变继承结构,也许有办法解决这个问题。
一种可能性是,如果确实有定义getter/setter的接口,则可以添加

@JsonSerialize(as=MyInterface.class)
@JsonDeserialize(as=MyInterface.class)

这将迫使Jackson仅使用通过特定接口可用任何内容。
自定义的序列化器/反序列化器也是一种可能,但这是相当多的工作。

lmvvr0a8

lmvvr0a82#

我有几个扩展LinkedHashMap<String, Object>的模型类:它们定义了 Package Map的get和put方法的getter和setter
这是一个典型的例子,说明什么时候 * 不 * 使用继承:您会发现其他一些代码(例如Jackson)将您的类视为其超类的示例,而这不是您希望它做的。在这种情况下(一般情况下也是如此),通常使用组合比使用继承更好。
我建议重写你的模型类来 * 包含 * 一个Map,而不是扩展一个Map。你得到的控制比方法多得多,得到的模型也不那么脆弱。如果你需要以Map的形式查看你的模型,那么实现一个asMap方法(或者类似的方法)来呈现这个视图。

s5a0g9ez

s5a0g9ez3#

您可以实现自己的org.codehaus.jackson.map.DeserializerProvider,它扩展了Jackson的org.codehaus.jackson.map.deser.StdDeserializerProvider并覆盖_createDeserializer方法:

import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.deser.StdDeserializerProvider;
import org.codehaus.jackson.map.DeserializationConfig;
...

class MyDeserializerProvider extends StdDeserializerProvider {

    @Override
    protected JsonDeserializer<Object> _createDeserializer(DeserializationConfig config, JavaType type, BeanProperty property) throws JsonMappingException {
        if (type.isMapLikeType()) {       // (1)
            return this._factory.createBeanDeserializer(config, this, type, property);
        } else {
            return super._createDeserializer(config, type, property);
        }
    }
}

(1)使用符合您需要的if-condition
自定义反序列化程序直接在ObjectMapper中注册:

ObjectMapper om = new ObjectMapper();
om.setDeserializerProvider(new MyDeserializerProvider());

我用Jackson 1.9.11测试了这个。

ppcbkaq5

ppcbkaq54#

在较新版本的jackson中(我猜〉= 2.9),只需使用

@JsonFormat(shape = JsonFormat.Shape.OBJECT)

相关问题