问题描述
当收到子类的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.getFields();
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类来反序列化。