将JSON数据转换成JAVA的实体类
看了好多博客不如这个up讲的好
完全搞懂
Json使用场景
首先说一下,有许多jar包都可以
1.Jackson
<properties>
<!--json 版本号-->
<jackson.version>2.8.7</jackson.version>
</properties>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
泛型的处理
通用配置
在静态配置代码块中
2.阿里巴巴的FastJson的具体使用
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.21</version>
</dependency>
1、序列化
1,问题1:不传参数时会把哪个字段消除,不会设置为null
如何解决
/**
* WriteMapNullValue指定序列化时包含null
*/
String personStr = JSON.toJSONString(person, SerializerFeature.WriteMapNullValue);
2、问题2 : 日期时间格式化
时间格式不是我们想要的
{"addr":"河南",
"birthday":"2022-07-31T11:04:22.283",
"id":1,
"name":null,
"pwd":"123",
"registerDate":1659236662194,
"websiteUrl":"com.edu.shengda"}
解决办法
在类的属性上添加注解
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date registerDate;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthday;
打印结果
{"addr":"河南","birthday":"2022-07-31 11:07:27","id":1,"name":null,"pwd":"123","registerDate":"2022-07-31 11:07:27","websiteUrl":"com.edu.shengda"}
3、问题3 : 奇怪的$ref
[{"id":3,"name":"L4"},{"$ref":"$[0]"},{"$ref":"$[0]"}]
如何解决
/**
* DisableCircularReferenceDetect 开启禁用引用探测
*/
String string = JSON.toJSONString(List,SerializerFeature.DisableCircularReferenceDetect);
3、问题3 : SerializeFilter定制处理
对属性和属性值在序列化前做定制处理
2、反序列化
1、问题1 当有泛型时
3、通用设置
测试的时候可以看一下
指定属性名
指定不参与序列化和反序列化的字段
3.Google的Gjson
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>