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

问题描述

当收到子类的json字符串的时候,如果用父类来进行反序列化,那就会出现数据丢失的情况。具体如下
json在继承关系当中的反序列化_第1张图片
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{

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

            JsonNode childNode = null;
            while(elementsIterator.hasNext()){
                Map.Entry 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类来反序列化。

你可能感兴趣的:(java)