json在继承关系当中的反序列化

问题描述

当收到子类的json字符串的时候,如果用父类来进行反序列化,那就会出现数据丢失的情况。具体如下
在这里插入图片描述
Family包含有Child,Child有两个子类,一个是Son,另一个是Daughter。
当收到的Json字符串为
{“child”:{“childName”:”张三”,”girlFirendName”:”小红”}}时,此时用Family去反序列化,”girlFirendName”:”小红” 信息会丢失。
这是因为在Family当中只包含有Child类,因此在反序列化的时候,就会用使用Child类,而Child类当中并没有girlFriendName信息,因此这段信息就会被丢弃。

解决方法

自定义反序列化类。
Child、Son、Daughter类都只包含有一个字段比较简单,这里直接略过,需要注意的是,Child、Son、Daughter都要包含有无参构造函数,否则解析会出现异常。
来看看Family类。
使用的是jackson包进行反序列化。

@JsonDeserialize(using = Family.FamilyDeserializer.class)
public class Family {

    private Child child;

    public Family(Child child){
        this.child = child;
    }


    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }

    //自定义反序列化类
    public static class FamilyDeserializer extends JsonDeserializer<Family>{

        @Override
        public Family deserialize(JsonParser arg0, DeserializationContext arg1)
                throws IOException, JsonProcessingException {
            ObjectReader reader = new ObjectMapper().reader();
            ObjectNode obj = (ObjectNode) reader.readTree(arg0);
            Iterator<Entry<String, JsonNode>> elementsIterator = obj.fields();

            JsonNode childNode = null;
            while(elementsIterator.hasNext()){
                Map.Entry<String, JsonNode> element = elementsIterator.next();
                if(element.getKey().equals("child")){
                    childNode = element.getValue();
                }
            }
            Family family = null;
            if(childNode != null){
                if(childNode.get("boyFriendName")!=null){
                    Daughter dau = reader.withType(Daughter.class).readValue(childNode);
                    family=new Family(dau);
                }else{
                    Son son = reader.withType(Son.class).readValue(childNode);
                    family = new Family(son);
                }
            }
            return family;
        }
    }
}

首先使用@JsonDeserialize标签来指定自定义反序列化的类,然后编写反序列化函数。当json中包含有“boyFriendName”字段时,就调用Daughter类来反序列化;否则就调用Son类来反序列化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值