2020-12-03 09:45:58 登录注册 RSS

当前位置: 公理网 >> 曝光信息 >> json在继承关系当中的反序列化

json在继承关系当中的反序列化
发布时间:2018-11-03| 来源:公理网 | 点击发表评论
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/hbdatouerzi/article/details/70196302
问题描述
当收到子类的json字符串的时候,如果用父类来进行反序列化,那就会出现数据丢失的情况。具体如下:
20170416162731460?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGJkYXRvdWVyemk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"alt="这里写图片描述"title="">

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)publicclassFamily{privateChildchild;publicFamily(Childchild){this.child=child;}publicChildgetChild(){returnchild;}publicvoidsetChild(Childchild){this.child=child;}//自定义反序列化类publicstaticclassFamilyDeserializerextendsJsonDeserializerFamily{@OverridepublicFamilydeserialize(JsonParserarg0,DeserializationContextarg1)throwsIOException,JsonProcessingException{ObjectReaderreader=newObjectMapper().reader();ObjectNodeobj=(ObjectNode)reader.readTree(arg0);IteratorEntryString,JsonNodeelementsIterator=obj.getFields();JsonNodechildNode=null;while(elementsIterator.hasNext()){Map.EntryString,JsonNodeelement=elementsIterator.next();if(element.getKey().equals("child")){childNode=element.getValue();}}Familyfamily=null;if(childNode!=null){if(childNode.get("boyFriendName")!=null){Daughterdau=reader.withType(Daughter.class).readValue(childNode);family=newFamily(dau);}else{Sonson=reader.withType(Son.class).readValue(childNode);family=newFamily(son);}}returnfamily;}}}
首先使用@JsonDeserialize标签来指定自定义反序列化的类,然后编写反序列化函数。当json中包含有“boyFriendName”字段时,就调用Daughter类来反序列化;否则就调用Son类来反序列化。
阅读更多

授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

最新新闻

手机浏览

公理网 版权所有

公理网 Total 0.068593(s) query 6, 报料QQ:点击这里

给我发消息