json反序列化⽗⼦类型_Jaskson精讲第7篇-类继承关系下的
JSON序列化与反序列化。。。
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的⼩伙伴以为Jackson只能在Spring框架内使⽤,其实不是的,没有这种限制。它提供了很多的JSON数据处理⽅法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易⽤,但绝对不是⼩玩具,更多的内容我会写成⼀个系列,5-10篇⽂章,请您继续关注我。
《序列化与反序列化核⼼⽤法-JSON框架Jackson精解第1篇》《特殊数据格式处理-JSON框架Jackson精解第2篇》《属性序列化⾃定义排序与字母表排序-JSON框架Jackson精解第3篇》《@JacksonInject与@JsonAlias注解-JSON框架Jackson精解第4篇》
《@JsonCreator⾃定义反序列化函数-JSON框架Jackson精解第5篇》《Jaskson精讲第6篇-⾃定义JsonSerialize与Deserialize实现数据类型转换》本篇⽂章是系列⽂章的第7篇,主要是为⼤家介绍⼀下,在Java 类继承的情况下如何实现⽗类及⼦类的JSON序列化与反序列化。
⼀、继承关系对象构建
⾸先构建⼀个ClsShape类表⽰形状。
public class ClsShape {}构建⼀个ClsCircle 类表⽰圆形。并添加了⼀系列的lombok注解,Data表⽰提供get、set、toString、hashCode等⽅法;EqualsAndHashCode注解在有继承关系的字类中使⽤;AllArgsConstructor和NoArgsConstructor分别提供全参和⽆参构造⽅法。
@Data@EqualsAndHashCode(callSuper = true)@AllArgsConstructor@NoArgsConstructorpublic class ClsCircle extends ClsShape { Integer radius; //弧度}构建⼀个长⽅形类ClsRectangle ,成员变量width宽度,height⾼度。
@Data@EqualsAndHashCode(callSuper = true)@AllArgsConstructor@NoArgsConstructorpublic class ClsRectangle extends ClsShape { private Integer width; private Integer height;}构建⼀个ClsView类,表⽰画⾯。画⾯中有很多的ClsShape形状,所以⽤⼀个List封装。
@Datapublic class ClsView { private List shapes;}⼆、序列化与反序列化测试
基础的形状类及画⾯类写完之后,下⾯的代码是⽤来完成:对象到Json字符串的序列化过程,和Json字符串反序列化为Java对象的过程代码。
@Testvoid testJSON2Object() throws IOException { ClsRectangle rectangle = new ClsRectangle(7,9); //构建正⽅形对象ClsCircle circle = new ClsCircle(8); //构建长⽅形对象 List shapes = new ArrayList<>(); //List shapes.add(circle);
shapes.add(rectangle); ClsView view = new ClsView(); //将List放⼊画⾯View view.setShapes(shapes); ObjectMapper mapper = new ObjectMapper(); System.out.println("-- 序列化 --"); String jsonStr = mapper.writeValueAsString(view);
System.out.println(jsonStr); System.out.println("-- 反序列化 --"); ClsView deserializeView = adValue(jsonStr, ClsView.class); System.out.println(deserializeView);}⼤家看最终在控制台的输出结果如下:序列化的过程是正常的,但是反序列化的时候报错了。
-- 序列化 --{"shapes":[{"radius":8},{"width":7,"height":9}]}-- 反序列化 --
com.fasterxml.UnrecognizedPropertyException: Unrecognized field "radius" (class
vuejson转对象ample.demo.javabase.ClsView["shapes"]->java.util.ArrayList[0]-&le.demo.javabase.ClsShape["radius"])抛出异常的主要原因是我们⽤来接收反序列化的结果时,使⽤的是List,Java程序并不明确的知道,这个ClsShape形状是圆形ClsCircle,还是正⽅形ClsRectangle。所以⽆法将字符串正确的反序列化为java对象。
三、@JsonTypeInfo注解加到⽗类定义上
为了解决上⾯的这种继承关系对象的反序列化出现的问题,jackson为我们提供了JsonTypeInfo注解,把它加在⽗类定义上⾯即可。
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)public class ClsShape {}在⽗类定义上⾯加上@JsonTypeInfo注解之后,序列化与反序列化的输出结果如下。
-- 序列化 --{"shapes":[{"@class":"ample.demo.javabase.ClsCircle","radius":8},
{"@class":"ample.demo.javabase.ClsRectangle","width":7,"height":9}]}-- 反序列化 --ClsView(shapes=
[ClsCircle(radius=8), ClsRectangle(width=7, height=9)])值得注意的是在序列化之后的java字符串中,每个Json对象都包含了⼀个新的属性@class,这也是该对象在继承关系下能够反序列化为正确的java对象(@class的值的类对象)的关键所在。
四、@JsonTypeInfo注解加到包含⽗类的成员变量上⾯
@JsonTypeInfo注解不仅可以加在⽗类的定义上⾯,也可以加到包含⽗类的成员变量上⾯。序列化和反序列化的结果和第三⼩节中的内容是⼀样的。
@Datapublic class ClsView { @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) private List shapes;}欢迎关注我的博客,⾥⾯有很多精品合集
本⽂转载注明出处(必须带连接,不能只转⽂字):字母哥博客。觉得对您有帮助的话,帮我点赞、分享!您的⽀持是我不竭的创作动⼒! 。另外,笔者最近⼀段时间输出了如下的精品内容,期待您的关注。
《⼿摸⼿教你学Spring Boot2.0》《Spring Security-JWT-OAuth2⼀本通》《实战前后端分离RBAC权限管理系统》《实战SpringCloud微服务从青铜到王者》《VUE深⼊浅出系列》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论