jackson如何根据另个属性来确定实例化具体实现类(基于spring-boot)

对于如果属性在抽象类中这个利用@JsonTypeInfo 和 @JsonSubTypes 很容易实现,如果这个属性与将要反序列化在同一层级,那个应该怎么做,将下面举个例子,基于spring-boot环境

  • public interface Item{
         
         
      
    }
    public  class  Person{
         
         
      private Integer age;
      private Item item;
    }
    // age<7
    public ChildItem implement Item {
         
         
      private String read;
      private String sleep;
    }
    // 7< age < 50
    public AdultItem implement Item {
         
         
      private String work;
      private String playGame;
    }
    
    // age > 50
    public OldItem implement Item {
         
         
      private String walk;
      private String talk;
    }
    
  • 上面定义Person对象,里面有item,具体实现类是通过age来决定jackson具体实例化那个类

  • 此时使用@JsonTypeInfo 和 @JsonSubTypes不好处理,它针对是json中都相同属性,根据属性值判断,可惜这里属性都不相同?

解决方案

1、完全手动实现反序列化

  • 如果实体不是很复杂这个还是可以接受,如果bean字段特别多,那么不好操作了

  • 也就实现StdDeserializer的deserialize方法

  • 示例代码(spring boot)下

  • @JsonComponent
    public class ItemDeserializer extends StdDeserializer<Item> {
         
         
    
        protected ItemDeserializer() {
         
         
            super(Item.class);
        }
    
        @Override
        public Item deserialize(JsonParser p, DeserializationContext ctxt) throws IOExcepti
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值