在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化器

Jackson允许配置多态类型处理,当JSON面对的转换对象是一个接口、抽象类或者一个基类的时候,可以通过一定配置实现JSON的转换。在实际项目中,Controller层接收入参以及在Dao层将对象以json的形式存入数据库时都可能会遇到这个问题。而Springboot和mp都支持使用Jackson处理json,从而可以利用Jackson的特点,解决这一问题。

注意

为了代码简洁,这里的代码忽略了set和get方法和构造函数

在本例中,父类Zoo有两个子类Dog和Cat类

public static class Zoo {
   
  
    private String name;
    private AnimalTypeEnum animalType;
  
}

父类Zoo中,包含一个代表动物种类的枚举字段

public enum AnimalTypeEnum {
   
    DOG("dog"),
    CAT("cat");
    private final String name;
}

对于子类Dog包含一个速度属性

public static class Dog extends Zoo {
   
    private Double speed;
}

对于子类Cat包含一个尺寸属性

public static class Cat extends Zoo {
   
    private Integer size;
}

我们想做的事情是根据Zoo中的动物类型枚举字段animalType,将JSON反序列化为两种子类

方法一

使用Jackson提供的处理注解可以实现上述功能

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXISTING_PROPERTY,
        property = "animalType",
        visible = true
)
@JsonSubTypes(
        {
   
                @JsonSubTypes.Type(value = Dog.class, name = "DOG"),
                @JsonSubTypes.Type(value = Cat.class, name = "CAT")
        }
)
public static class Zoo {
   
  
    private String name;
    private AnimalTypeEnum animalType;
  
}

@JsonTypeInfo()

该注解表示对该类开启多态类型处理,包含四个属性

use 代表使用哪一种类型识别码

JsonTypeInfo.Id.NAME 是本例中选择的类型识别码,意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值