【问题标题】:How can I prevent Jackson from serializing a polymorphic type's annotation property?如何防止 Jackson 序列化多态类型的注释属性?
【发布时间】:2011-04-29 01:29:58
【问题描述】:

我有多态类型和从 JSON 到 POJO 的反序列化工作。事实上,我遵循了文档here。将 POJO 序列化为 JSON 时,我得到了一个不需要的属性,特别是逻辑类型名称。

import static org.codehaus.jackson.annotate.JsonTypeInfo.*;

@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="type")
@JsonSubTypes({
    @JsonSubTypes.Type(value=Dog.class, name="dog"),
    @JsonSubTypes.Type(value=Cat.class, name="cat")
})    
public class Animal { ... }

public class Dog extends Animal { ... }
public class Cat extends Animal { ... }

当 Jackson 序列化为 JSON 时,它提供了我不想公开的类型信息。

{"type":"dog", ... }
{"type":"cat", ... }

我能以某种方式阻止这种情况吗?我只想在反序列化时忽略type

【问题讨论】:

  • 你说,“我只想在反序列化时忽略类型。”您的意思是“我只想在序列化时忽略类型”?
  • 令我印象深刻的是,您设法从文档中弄清楚了这么多。在那个 wiki 页面上没有一个 @JsonSubTypes 的使用示例。

标签: java json jackson


【解决方案1】:

一个简单的解决方案是将@JsonTypeInfo@JsonSubTypes 配置移动到MixIn,然后只注册MixIn 进行反序列化。

mapper.getDeserializationConfig().addMixInAnnotations(MyClass.class, MyMixIn.class)

【讨论】:

【解决方案2】:

这花了我很长时间才解决,所以我想我会分享。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY,
visible = false, property = "type")

visible=false 确保如果属性type 存在于类中,则在反序列化期间不会使用type 的值填充它。

include = JsonTypeInfo.As.EXISTING_PROPERTY 规定如果属性type 存在,则在序列化期间使用该值,否则什么也不做。

所以把它们放在一起:

import static org.codehaus.jackson.annotate.JsonTypeInfo.*;

@JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, visible = false, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value=Dog.class, name="dog"),
    @JsonSubTypes.Type(value=Cat.class, name="cat")
})    
public class Animal { ... }

public class Dog extends Animal { ... }
public class Cat extends Animal { ... }

【讨论】:

  • 这不能回答所提出的问题。
  • @Siddhu 我已经编辑了我的回复,以更好地解决所提出的问题。感谢您的反馈。希望对您有所帮助。
猜你喜欢
  • 2014-11-11
  • 2020-08-01
  • 2019-08-10
  • 2014-05-01
  • 2014-08-07
  • 2011-12-07
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多