《Java单元测试实战》——编写技巧:Java单元测试技巧之JSON序列化(9)

简介: 《Java单元测试实战》——编写技巧:Java单元测试技巧之JSON序列化(9)

《Java单元测试实战》——编写技巧:Java单元测试技巧之JSON序列化(8) https://developer.aliyun.com/article/1232280?groupCode=java



七、 JSON反序列化技巧

 

这里以Fastjson为例,介绍一些JSON反序列化技巧。

 

1. 反序列化对象

 

利用JSON.parseObject方法反序列化对象:

 

image.png

2. 反序列化数组

 

利用JSON.parseObject方法反序列化数组:

image.png

3. 反序列化集合

 

利用JSON.parseArray方法反序列化列表:

image.png

 

利用JSON.parseObject方法反序列化集合:

image.png


4. 反序列化映射

 

利用JSON.parseObject方法反序列化映射:


image.png

注意:如果映射的key是复杂类型,这种方法反序列会报格式错误,需要自定义反序列化器。

 

5. 反序列化模板对象

 

利用JSON.parseObject方法反序列化模板对象:

image.png

6. 反序列化非公有字段

 

由于某些属性字段没有公有设置方法,或者以字段名称作为公有设置方法。当需要反序列化这些属性字段时,需要指定SupportNonPublicField(支持非公有字段)反序列化参数。

image.png

7. 反序列化Builder模式类

 

有些同学喜欢用Builder模式,导致实体类并没有公有构造方法。当利用Fastjson反序列化这些类是,就会出现以下问题:

 

image.png

 

只要对应的Builder类有默认构造方法,就可以采用下面的方式序列化。

image.png

首先通过JSON.parseObject方法+SupportNonPublicField参数反序列化Builder对象,然后通过Builder对象的build方法来构造实体对象。

 

如果对应的Builder类没有默认构造方法,或者需要反序列化模板对象时,需要自定义JSON反序列化器。

 

8. 反序列化丢失字段值

 

Fastjson支持没有默认构造方法的类的反序列化,但存在丢失字段值的问题。


image.png

咨询过Fastjson维护人员,目前还没有解决这个bug,有待后续版本中解决。如果要反序列化这种类,可以考虑添加默认构造方法或自定义反序列化器。

 

9. 自定义反序列化器

 

对应一些类对象,需要把特殊格式文本反序列化为对象,就必须自定义反序列化器。比如:Geometry序列化文本,通常采用WKT(Well-known text)表示,便于用户快速阅读理解。


1) 全局配置反序列化器

 

通过JSON序列化全局配置指定类反序列化器:

image.png

注意:这种方式不支持类继承,必须指定到具体类。比如要序列化Point对象,就必须配置Point类的反序列化器。

 

2) 特定配置反序列化器

 

通过JSON序列化特定配置指定类反序列化器:


image.png

注意:这种方式不支持类继承,必须指定到具体类。比如要序列化Point对象,就必须配置Point类的反序列化器。

 

3) 注解配置反序列化器

 

通过JSON序列化注解配置指定类反序列化器:


image.png

 

其中:GeometryDeserializer为自定义类,这里就不贴出具体实现了。


 

《Java单元测试实战》——编写技巧:Java单元测试技巧之JSON序列化(10) https://developer.aliyun.com/article/1232278?groupCode=java

相关文章
|
存储 开发框架 .NET
WPF+ASP.NET SignalR实现后台通知
WPF+ASP.NET SignalR实现后台通知
359 0
|
Apache
crontab 每隔1小时 2小时的执行job写法
加任务:   crontab -e   0 */1 * * * command   0 */2 * * * command 查询任务是否加了:   crontab -l   0 */1 * * * command  0...
4018 0
[java进阶]——stream流你还不会用吗?超详细使用介绍
[java进阶]——stream流你还不会用吗?超详细使用介绍
619 0
|
存储 数据可视化 索引
Grafana 系列 - 统一展示 -7-ElasticSearch 数据源
Grafana 系列 - 统一展示 -7-ElasticSearch 数据源
|
SQL 关系型数据库 MySQL
springboot项目操作mysql出现锁表问题情况
springboot项目操作mysql出现锁表问题情况
240 3
|
负载均衡 前端开发 Java
SpringBoot如何使用Feign实现远程接口调用
SpringBoot如何使用Feign实现远程接口调用
1580 0
SpringBoot如何使用Feign实现远程接口调用
|
JavaScript
【Vue 组件化开发 三】父组件给子组件传递数据、组件通信(父传子、子传父)、父访问子(children、ref)、动态组件(is、component)
本章学习父组件给子组件传递数据、组件通信(父传子、子传父)、父访问子(children、ref)、动态组件(is、component)。
839 0
|
JavaScript 搜索推荐 API
【Ant Design Vue V3版本填坑记录三】一套代码实现表格常用属性
【Ant Design Vue V3版本填坑记录三】一套代码实现表格常用属性
2593 0
|
存储 分布式计算 监控
Hadoop2.x 参数汇总
linux参数 以下参数最好优化一下: 文件描述符ulimit -n 用户最大进程 nproc (hbase需要 hbse book) 关闭swap分区 ...
1847 0
探索操作系统中的线程同步机制
【8月更文挑战第31天】在多线程编程领域,理解并实现线程同步是至关重要的。本文通过浅显易懂的语言和生动的比喻,带你走进线程同步的世界,从互斥锁到信号量,再到条件变量,逐步揭示它们在协调线程行为中的作用。我们将一起动手实践,用代码示例加深对线程同步机制的理解和应用。