Jackson 的 @JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type") 读取 JSON

Posted

技术标签:

【中文标题】Jackson 的 @JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type") 读取 JSON 的所有字段,除了 "type"【英文标题】:Jackson's @JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type") reads all fields of JSON except for "type" 【发布时间】:2017-02-04 12:03:06 【问题描述】:

我逐行浏览了每一行代码,但我认为这就是 Jackson 在内部处理多态性的方式。

使用DogCat扩展Animal的经典例子:

@JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type")
@JsonTypeIdResolver(AnimalTypeIdResolver.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class Animal implements Serializable 
    public AnnotatorBundleConfig(String name) 
        super();
        this.name = name;
    

狗类:

public class DogAnimal extends Animal 
    @JsonCreator
    public DogAnimal(
        @JsonProperty(value="name", required=true) String name,
        @JsonProperty(value="bark_decibel") int bark_decibel)
    
    super(name);
    this.bark_decibel = bark_decibel;

猫类:

public class CatAnimal extends Animal 
    @JsonCreator
    public CatAnimal(
        @JsonProperty(value="name", required=true) String name,
        @JsonProperty(value="meow_level") int meow_level)
    
    super(name);
    this.meow_level = meow_level;

AnimalTypeIdResolver 是扩展 AbstractTypeIdResolver 的典型 TypeIdResolver。

出于某种非常奇怪的原因,bark_decibelmeow_level 从 JSON 反序列化,但 typenull 的形式进入。有什么想法吗?

【问题讨论】:

复制:Jackson - @JsonTypeInfo property is being mapped as null? 【参考方案1】:

visible=true 设置为@JsonTypeInfo

@JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type", visible=true)

参考this post

【讨论】:

以上是关于Jackson 的 @JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type") 读取 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 的 @JsonTypeInfo(use = Id.CUSTOM, include = As.PROPERTY, property = "type") 读取 JSON

JSONTypeInfo 不忽略继承映射中的属性

Spring Boot 忽略 Rest Controller 中的 Jackson 注释

Jackson 反序列化意外令牌(END_OBJECT),

使用Jackson As.External_Property和Collection

如何在Swagger中描述多态端点?