杰克逊 - 在序列化时忽略Map超类

gil*_*lby 5 serialization json map resteasy jackson

我有一些扩展的模型类LinkedHashMap<String, Object>:它们定义了包含Map的get和put方法的getter和setter.我正在尝试使用Jackson(使用RESTEasy)序列化这些类的实例,但杰克逊拒绝关注我的getter注释@JsonProperty.相反,它只是序列化支持映射的键值对.我尝试使用@JsonAutoDetect禁用所有方法和字段的自动检测,但这并没有改变任何东西.有没有办法阻止杰克逊自动序列化地图,还是我必须创建不扩展的新模型类LinkedHashMap<String, Object>

Sta*_*Man 11

我同意@skaffman的回应.但是如果你不能轻易地彻底改变继承结构,可能有办法解决这个问题.

一种可能性是,如果你有一个定义getter/setter的接口,你可以添加

@JsonSerialize(as=MyInterface.class)
@JsonDeserialize(as=MyInterface.class)
Run Code Online (Sandbox Code Playgroud)

这会迫使Jackson只使用通过特定界面提供的任何东西.

自定义序列化器/解串器也是可能的,但这是相当多的工作.


ska*_*man 7

我有一些扩展的模型类LinkedHashMap<String, Object>:它们定义了包含Map的get和put方法的getter和setter

这是使用继承的典型示例:您发现其他一些代码(即Jackson)正在将您的类视为其超类的实例,这不是您想要它做的.在这些情况下(以及一般情况下),通常使用组合而不是继承更好.

我建议重写模型类以包含地图,而不是扩展地图.你得到的控制力远远超过方式,结果模型不那么脆弱.如果您需要将模型视为a Map,则实现asMap呈现该视图的方法(或类似的东西).