【微服务】167:工具类JsonUtils完成json的序列化和反序列化
今天是刘小爱自学Java的第167天。
感谢你的观看,谢谢你。
学习计划安排如下:
- 在导入数据到索引库的过程使用到了一个工具类JsonUtils,在此做一个总结说明。
很早之前就学过json,一直也在使用它,它就相当于前端与后台之间数据传输的一个媒介。
为了数据之间传输方便,在数据库中存的数据有的时候会设置成json格式的字符串。
而Java中数据的体现方法无外乎就是对象,所以会涉及到Json字符串的序列化与反序列化。
一、Json的序列化
JsonUtils工具类非常地强大,一共有5个方法,可以完成json字符串的各种转化。
其中涉及到了一个核心类ObjectMapper,下面的各种方法都是在该类的基础上实现的。
下文中的mapper就是指的ObjectMapper类的一个对象。
①json的序列化
toString()方法可以将任意一个对象转换成json格式的字符串。
- 第1个if条件语句判断对象是否为空。
- 第2个if条件语句判断对象类型是否是字符串,
- mapper调用writeValueAsString()方法可以将对象转换成json字符串。
Java普通对象,list集合以及map集合都可以直接使用该方法直接实现转换。
好,代码编写好后做一个测试:
自定义一个User类,有name和age两个属性,这里创建两个对象做一个测试。
调用toString()方法可以将对象转换成json格式的字符串,也就是上述中的userOneJosn。
同理也可以将List集合转换成json格式的字符串,也就是上述中的userListJson。
关于map集合也是一样的,就不赘述了。
以上也就实现了json的序列化。
二、Json的反序列化一
有序列化自然也会有反序列化。
②json的反序列化:转换成对象
toBean()方法转换json字符串成对象。
使用mapper调用readValue方法,参数有两个:
- json:也就是json字符串。
- tClass:也就是要转换成对象对应的Class对象。
③json的反序列化:转换成List
toList()方法转换json字符串成List集合。
使用mapper调用readValue方法,参数:
- json:同样也是json字符串。
- mapper.getTypeFactory().constructListType()说明集合的泛型。
- List.class:也就是List集合的Class对象。
- eClass也就是要转换成的集合中的对象对应的Class对象。
做个测试:
反序列化等于是将序列化的过程反过来了。
上述两个json字符串都是序列化测试中的结果。
- 调用toBean()方法可以将json字符串转换成一个对象。
- 调用toList()方法可以将json字符串转换成一个List集合。
注意:如果json字符串是一个集合时,也就是上述的listJson,调用toBean()方法会报错。
三、Json的反序列化二
除了普通对象和List集合,还有Map集合和一个通用方法。
④json的反序列化:转换成Map
toMap()方法转换json字符串成Map集合。
使用mapper调用readValue()方法,注意和toList()方法中的区别:
-
constructListType()对应的是List集合。
-
constructMapType()对应的是Map集合。
Map集合中要说明key和value对应的Class对象。
⑤json的反序列化通用版
对于该方法的理解,上述②③④能实现的都可以通过它实现。
观察其参数,第一个参数都是json字符串,主要在于第2个参数的不同。
其实②③④就相当于在该方法中做了一个垂直细分:
- ②中toBean方法第二个参数直接说明了对象的Class对象。
- ③中toList方法第二个参数通过constructListType()方法来说明。
- ④中toMap方法第二个参数通过constructMapType()方法来说明。
做一个测试:
调用toMap()方法将mapJson反序列化成一个map,也就是一个键值对,上述中key为1,value为一个User对象。
调用nativeRead()方法将json字符串转换成对应的对象。
上述例子中是一个比较复杂的json字符串,一个map集合,key为字符串,value为一个包含User对象的list集合。
最后
行有不得反求诸己,我是@刘小爱
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。