JSON学习笔记
Jackson篇
Jackson是目前使用非常广泛的JSON生成和解析工具。
Jackson由3个模块组成:
- Jaskson-core:核心包,包括JSON解析器生成器
- Jackson-annotations:注解包,提供处理数据的注解
- Jackson-databind:数据绑定包,将数据与Java对象绑定
【注】Jackson-databind依赖于core、annotations包,一般引入databind包即可。
ObjectMapper是Jackson的核心类,用来完成JSON的读写操作。
- writeValueAsString(): 将Java对象 –> JSON字符串
- readValue(): 将JSON字符串 –> Java对象
如果是Spring Boot项目,ObjectMapper已经存在于Spring容器中,可以通过`@Autowired注入ObjectMapper对象。
Java对象的成员变量的名称和值都会成为JSON中的属性名和属性值。
(强烈推荐!)可以通过将`@JsonProperty注解在Java对象的成员变量上修改转换JSON后的属性名称,如图1所示。
如果不需要将Java对象的某个成员变量转换为JSON,则可以在成员变量上加上`@JsonIgnore注解,如图2所示。
或者使用`@JsonIgnoreProperties注解,将其注解在Java类上,最终实现效果相同,如图3所示。
如果在Java对象中使用private成员变量,并用Getter/Setter方法操作成员变量,则JSON将Getter方法确定JSON属性名,如图4所示。
- 既然Jackson会根据Getter方法确定JSON属性名,那么用来JSON属性名称的`@JsonProperty注解同样可以标注在Getter方法上
Jackson按照以下顺序确定JSON属性名:
- public的成员变量
- public的Getter方法(在成员变量设置为private的情况下)
- 所有作用域的Setter方法
【强烈推荐】只根据成员变量确定JSON属性名,并忽略掉所有的Getter / Setter方法的自动检测,方法如下:修改ObjectMapper对象的属性,如图所示
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- 如果是Spring Boot项目,则可以在application.properties配置文件中添加如下配置:
如图6所示。spring.jackson.visibility.all = none spring,jackson.visibility.field = any
- 如果是Spring Boot项目,则可以在application.properties配置文件中添加如下配置:
自定义JSON对象:
- 使用ObjectMapper对象的**createObjectNode()**方法,创建一个新的对象。
- 使用ObjectNode对象的**put() / putArray()**方法添加数据。
- 在JSON中添加数组时,实际上是往ArrayNode对象中添加数组内容,并保存到JSON对象中。
- 具体使用情况如图7所示
解析JSON对象(Java对象中缺失对应的属性)
类级别忽略未知JSON属性:
使用`**@JsonIgnoreProperties(ignoreUnknown = true)**注解声明在类上@JsonIgnoreProperties(ignoreUnknown = true) public class User { // ... }
全局忽略未知JSON属性:
配置ObjectMapper对象的属性,代码如下:// 配置忽略未知属性 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
解析JSON对象(不完整的JSON对象)
- 直接使用**readValue()**方法读取JSON对象。
Fastjson篇
Fastjson是Alibaba开发的用于实现JSON对象与Java对象之间相互转换的包。
Fastjson包中有3个类:
- JSON
- JSONArray:继承自JSON,实现了List接口,代表JSON对象数组,其存储这一个个的JSON对象。
- JSONObject:继承自JSON,实现了Map接口,代表着JSON对象,所有数据都是以“键:值”的方式出现。
常用方法:
- **parseObject()**:将JSON字符串 –> JSONObject
- **toJSONString()**:将JSONObject / JSONArray –> JSON字符串
- parseArray(): 将JSON字符串数组 –> JSONArray
参考文章:使用Jackson生成和解析JSON、Jackson忽略未知的JSON属性、JSON格式及FastJson使用详解