接上篇:https://developer.aliyun.com/article/1227485?spm=a2c6h.13148508.setting.29.48e04f0eaBVGWH
七、 JSON反序列化技巧
这里以Fastjson为例,介绍一些JSON反序列化技巧。
1. 反序列化对象
利用JSON.parseObject方法反序列化对象:
2. 反序列化数组
利用JSON.parseObject方法反序列化数组:
3. 反序列化集合
利用JSON.parseArray方法反序列化列表:
利用JSON.parseObject方法反序列化集合:
4. 反序列化映射
利用JSON.parseObject方法反序列化映射:
注意:
如果映射的key是复杂类型,这种方法反序列会报格式错误,需要自定义反序列化器。
5. 反序列化模板对象
利用JSON.parseObject方法反序列化模板对象:
6. 反序列化非公有字段
由于某些属性字段没有公有设置方法,或者以字段名称作为公有设置方法。当需要反序列化这些属性字段时,需要指定SupportNonPublicField(支持非公有字段)反序列化参数。
7. 反序列化Builder模式类
有些同学喜欢用Builder模式,导致实体类并没有公有构造方法。当利用Fastjson反序列化这些类是,就会出现以下问题:
只要对应的Builder类有默认构造方法,就可以采用下面的方式序列化。
首先通过JSON.parseObject方法+SupportNonPublicField参数反序列化Builder对象,然后通过Builder对象的build方法来构造实体对象。
如果对应的Builder类没有默认构造方法,或者需要反序列化模板对象时,需要自定义JSON反序列化器。
8. 反序列化丢失字段值
Fastjson支持没有默认构造方法的类的反序列化,但存在丢失字段值的问题。
咨询过Fastjson维护人员,目前还没有解决这个bug,有待后续版本中解决。如果要反序列化这种类,可以考虑添加默认构造方法或自定义反序列化器。
9. 自定义反序列化器
对应一些类对象,需要把特殊格式文本反序列化为对象,就必须自定义反序列化器。比如:Geometry序列化文本,通常采用WKT(Well-known text)表示,便于用户快速阅读理解。
1) 全局配置反序列化器
通过JSON序列化全局配置指定类反序列化器:
注意:
这种方式不支持类继承,必须指定到具体类。比如要序列化Point对象,就必须配置Point类的反序列化器。
2) 特定配置反序列化器
通过JSON序列化特定配置指定类反序列化器:
注意:
这种方式不支持类继承,必须指定到具体类。比如要序列化Point对象,就必须配置Point类的反序列化器。
3) 注解配置反序列化器
通过JSON序列化注解配置指定类反序列化器:
其中
GeometryDeserializer为自定义类,这里就不贴出具体实现了。
接下篇:https://developer.aliyun.com/article/1227480?groupCode=java