java json序列化工具类_工具类JsonUtils完成json的序列化和反序列化

本文介绍了如何使用Java的JsonUtils工具类及其核心的ObjectMapper类进行JSON的序列化和反序列化。文章详细讲解了将对象转换为JSON字符串、将JSON字符串转换回对象、转换为List集合和Map集合的方法,并提供了相应的测试示例。
摘要由CSDN通过智能技术生成

今天是刘小爱自学Java的第167天。

感谢你的观看,谢谢你。

9e745e8e9219f19c2acd010c79f29101.png

学习计划安排如下:在导入数据到索引库的过程使用到了一个工具类JsonUtils,在此做一个总结说明。

很早之前就学过json,一直也在使用它,它就相当于前端与后台之间数据传输的一个媒介。

为了数据之间传输方便,在数据库中存的数据有的时候会设置成json格式的字符串。

而Java中数据的体现方法无外乎就是对象,所以会涉及到Json字符串的序列化与反序列化。

一、Json的序列化

JsonUtils工具类非常地强大,一共有5个方法,可以完成json字符串的各种转化。

其中涉及到了一个核心类ObjectMapper,下面的各种方法都是在该类的基础上实现的。

下文中的mapper就是指的ObjectMapper类的一个对象。

12c731b307078715ab5009d8055f9221.png

①json的序列化

toString()方法可以将任意一个对象转换成json格式的字符串。第1个if条件语句判断对象是否为空。

第2个if条件语句判断对象类型是否是字符串,

mapper调用writeValueAsString()方法可以将对象转换成json字符串。

Java普通对象,list集合以及map集合都可以直接使用该方法直接实现转换。

好,代码编写好后做一个测试:

e4361d13b23d8e7a49ab7a05a6e52242.png

自定义一个User类,有name和age两个属性,这里创建两个对象做一个测试。

调用toString()方法可以将对象转换成json格式的字符串,也就是上述中的userOneJosn。

同理也可以将List集合转换成json格式的字符串,也就是上述中的userListJson。

关于map集合也是一样的,就不赘述了。

以上也就实现了json的序列化。

二、Json的反序列化一

有序列化自然也会有反序列化。

c36cfb1a24fb55acda061bca9f012552.png

②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对象。

做个测试:

4e3f2ea534f6a0c204bebf968b7224bb.png

反序列化等于是将序列化的过程反过来了。

上述两个json字符串都是序列化测试中的结果。调用toBean()方法可以将json字符串转换成一个对象。

调用toList()方法可以将json字符串转换成一个List集合。

注意:如果json字符串是一个集合时,也就是上述的listJson,调用toBean()方法会报错。

三、Json的反序列化二

除了普通对象和List集合,还有Map集合和一个通用方法。

822262008a4e0a86a26acf1484baca59.png

④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()方法来说明。

做一个测试:

d4f3c75aa69df69a7868bd69d0ee9b55.png

调用toMap()方法将mapJson反序列化成一个map,也就是一个键值对,上述中key为1,value为一个User对象。

调用nativeRead()方法将json字符串转换成对应的对象。

上述例子中是一个比较复杂的json字符串,一个map集合,key为字符串,value为一个包含User对象的list集合。

最后

行有不得反求诸己,我是@刘小爱

一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。

JSON是基于JAVA7编写,对比阿里的JSON三次测试结果如下: 10万次序列化,1万次反序列化,毫秒。 阿里序列化时间 1229 1133 1179 阿里反序列化时间 478 523 466 HZS序列化时间 1089 998 1010 HZS反序列化时间 606 623 635 测试代码如下: { org.hzs.json.JSONObject bjson; java.util.LinkedList<String> jd_Set = new java.util.LinkedList<>(); java.util.Random d1 = new java.util.Random(); java.util.UUID d2; int ji_i; long ji起始时间_i; long ji截至时间_i; java.util.Date date = new java.util.Date(); //生成1万个序列化後的文本 for (ji_i = 0; ji_i < 10000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(); bjson.put("a1", d1.nextDouble()); bjson.put("a2", d1.nextDouble()); bjson.put("a3", d1.nextDouble()); bjson.put("a4", d1.nextInt()); bjson.put("a5", d1.nextInt()); bjson.put("a6", d1.nextLong()); bjson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); bjson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b4", d2.toString()); bjson.put("c", new java.util.Date()); jd_Set.add(bjson.toString()); } com.alibaba.fastjson.JSONObject ajson, a1json = new com.alibaba.fastjson.JSONObject(); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 100000; ji_i++) { ajson = (com.alibaba.fastjson.JSONObject) a1json.clone(); ajson.put("a1", d1.nextDouble()); ajson.put("a2", d1.nextDouble()); ajson.put("a3", d1.nextDouble()); ajson.put("a4", d1.nextInt()); ajson.put("a5", d1.nextInt()); ajson.put("a6", d1.nextLong()); ajson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); ajson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b4", d2.toString()); ajson.put("c", new java.util.Date()); ajson.toString(); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("阿里变量序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 10000; ji_i++) { ajson = com.alibaba.fastjson.JSONObject.parseObject(jd_Set.get(ji_i)); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("阿里反序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 100000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(); bjson.put("a1", d1.nextDouble()); bjson.put("a2", d1.nextDouble()); bjson.put("a3", d1.nextDouble()); bjson.put("a4", d1.nextInt()); bjson.put("a5", d1.nextInt()); bjson.put("a6", d1.nextLong()); bjson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); bjson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b4", d2.toString()); bjson.put("c", new java.util.Date()); bjson.toString(); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("HZS变量序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 10000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(jd_Set.get(ji_i)); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("HZS反序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值