专栏首页零基础自学Java【微服务】167:工具类JsonUtils完成json的序列化和反序列化

【微服务】167:工具类JsonUtils完成json的序列化和反序列化

学习计划安排如下:

  • 在导入数据到索引库的过程使用到了一个工具类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集合。

本文分享自微信公众号 - 刘小爱(liuxiaoai946),作者:刘小爱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【微服务】165:导入数据到索引库

    上述也就是我们前几天一直在分析的数据,也就是对应Goods这个实体类,同时将这个实体类和索引库对应起来。

    刘小爱
  • 【Java】基础15:字符串与static

    API,全称叫Application Programming Interface,翻译成中文就是:应用程序编程接口。

    刘小爱
  • 【微服务】147:品牌新增业务

    show默认值是false,是用来隐藏/显示对话框的,③其实也就对应着弹出的对话框。

    刘小爱
  • 服务端测试之PostMan自动生成测试脚本

    作者本着在实践中学习,在学习中实践的思考模式,将理论知识与实际应用相结合,举出真实的案例,让读者学会举一反三。

    无涯WuYa
  • 机器之心实操 | 亚马逊详解如何使用MXNet在树莓派上搭建实时目标识别系统

    选自AWS 机器之心编译 参与:思源 在过去的五年中,深度神经网络已经解决了许多计算困难的问题,特别是计算机视觉。因为深度神经网络需要大量的计算力来训练模型,所...

    机器之心
  • 【未来已来】脑科学五大前沿技术

    2015年8月19日,美国杜克大学医学中心神经认知障碍计划主任MuraliDoraiswamy在世界经济论坛上在线发表了一篇文章,总结了能展现脑科学未来前景...

    新智元
  • 谷歌为DeepMind AI开发“打盹”技能,让它在休息时自我“反省”

    镁客网
  • 空气污染和噪声与老年人局部脑结构的关系

    了解空气污染和噪声与神经认知能力丧失之间的关系很重要,本文在老年人中评估了住宅空气污染和噪声与神经认知测试表现以及局部脑萎缩的标志物-局部回指数(LGI,loc...

    用户1279583
  • 设计模式—— 七 :单例模式

    Sngleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实 例,并且是自行实例化的(在Singleton中自己使用new Si...

    三分恶
  • Go语言中常用的基本数据类型

    Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。

    极客运维圈

扫码关注云+社区

领取腾讯云代金券