Jackson对多态和多子类序列化的处理配置

异常:

Can not construct instance of XXXX, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

jackson允许配置多态类型处理,当进行反序列话时,JSON数据匹配的对象可能有多个子类型,为了正确的读取对象的类型,我们需要添加一些类型信息。可以通过下面几个注解来实现:

interface

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@clazz")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Terms4AccuracyLevelVo.class, name = "AccuracyLevel"),
        @JsonSubTypes.Type(value = Terms4AnswerCidVo.class, name = "AnswerCid"),
        @JsonSubTypes.Type(value = Terms4IsRightVo.class, name = "IsRight"),
})
public interface ITerms extends Comparable<ITerms>, Serializable {
    ... ...
}

class

@Data
@NoArgsConstructor
@ApiModel(value = "准确度等级统计", description = "准确度等级统计")
public class Terms4AccuracyLevelVo implements ITerms {
    ... ...
}
@Data
@NoArgsConstructor
@ApiModel(value = "答案内容统计", description = "答案内容统计")
public class Terms4AnswerCidVo implements ITerms {
    ... ...
}
@Data
@NoArgsConstructor
@ApiModel(value = "答案对错统计", description = "答案对错统计")
public class Terms4IsRightVo implements ITerms {
    ... ...
}

@JsonTypeInfo

use:定义使用哪一种类型识别码,它有下面几个可选值:
    1JsonTypeInfo.Id.CLASS:使用完全限定类名做识别
    2JsonTypeInfo.Id.MINIMAL_CLASS:若基类和子类在同一包类,使用类名(忽略包名)作为识别码
    3JsonTypeInfo.Id.NAME:一个合乎逻辑的指定名称
    4JsonTypeInfo.Id.CUSTOM:自定义识别码,由@JsonTypeIdResolver对应,稍后解释
    5JsonTypeInfo.Id.NONE:不使用识别码
include(可选):指定识别码是如何被包含进去的,它有下面几个可选值:
    1JsonTypeInfo.As.PROPERTY:作为数据的兄弟属性
    2JsonTypeInfo.As.EXISTING_PROPERTY:作为POJO中已经存在的属性
    3JsonTypeInfo.As.EXTERNAL_PROPERTY:作为扩展属性
    4JsonTypeInfo.As.WRAPPER_OBJECT:作为一个包装的对象
    5JsonTypeInfo.As.WRAPPER_ARRAY:作为一个包装的数组
property(可选):制定识别码的属性名称
    此属性只有当use为
        JsonTypeInfo.Id.CLASS(若不指定property则默认为@classJsonTypeInfo.Id.MINIMAL_CLASS(若不指定property则默认为@c)
        JsonTypeInfo.Id.NAME(若不指定property默认为@type)
    include为JsonTypeInfo.As.PROPERTYJsonTypeInfo.As.EXISTING_PROPERTY、JsonTypeInfo.As.EXTERNAL_PROPERTY时才有效
defaultImpl(可选):如果类型识别码不存在或者无效,可以使用该属性来制定反序列化时使用的默认类型
visible(可选,默认为false):是否可见
    属性定义了类型标识符的值是否会通过JSON流成为反序列化器的一部分,默认为fale,也就是说,jackson会从JSON内容中处理和删除类型标识符再传递给JsonDeserializer

@JsonSubTypes

作用于类/接口,用来列出给定类的子类,只有当子类类型无法被检测到时才会使用它
一般是配合@JsonTypeInfo在基类上使用,比如:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@clazz")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Terms4AccuracyLevelVo.class, name = "AccuracyLevel"),
        @JsonSubTypes.Type(value = Terms4AnswerCidVo.class, name = "AnswerCid"),
        @JsonSubTypes.Type(value = Terms4IsRightVo.class, name = "IsRight"),
})

@JsonSubTypes

@JsonSubTypes.Type[] 数组,里面枚举了多态类型(value对应类)和类型的标识符值(name对应@JsonTypeInfo中的property标识名称的值,此为可选值,若不制定需由@JsonTypeName在子类上制定) ,如:

@Data
@NoArgsConstructor
@ApiModel(value = "答案对错统计", description = "答案对错统计")
@JsonTypeName(value = "IsRight")
public class Terms4IsRightVo implements ITerms {
    ... ...
}

转载于:https://my.oschina.net/u/3664884/blog/1932829

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值