文章目录
- 一.Jackson
- 模块说明
- 二.ObjectMapper
- 基本功能
- 使用`ObjectMapper`的一些核心方法:
- 示例代码
- 1. 序列化示例
- 2. 反序列化示例
- 3. `JsonNode` 处理示例
- 高级配置
- 三.各种Node
- 1. `ObjectNode`
- 2. `ArrayNode`
- 3. `ValueNode`
- 4. `MissingNode`
- 示例
一.Jackson
Jackson 库主要分为三个核心模块:jackson-core
,jackson-annotations
,和 jackson-databind
。
模块说明
-
jackson-core
:- 提供了Jackson的核心功能,包括基础的读写API(
JsonParser
和JsonGenerator
),以及JSON处理的低级实现。
- 提供了Jackson的核心功能,包括基础的读写API(
-
jackson-annotations
:- 包含了用于配置Jackson数据绑定行为的注解。这些注解通常用于指定如何将Java对象序列化为JSON,或者如何从JSON反序列化为Java对象。
-
jackson-databind
:- 提供了高级数据绑定支持,依赖于
jackson-core
提供的API和jackson-annotations
定义的配置注解。它允许直接将JSON转换成Java对象(反序列化)或将Java对象转换成JSON(序列化)。
- 提供了高级数据绑定支持,依赖于
二.ObjectMapper
基本功能
- 序列化: 将Java对象转换为JSON字符串。
- 反序列化: 将JSON字符串转换为Java对象。
- 数据绑定: 支持从各种数据源生成和消耗JSON,包括从文件、URL或字符串。
- 流式API: 提供了一种流式生成JSON和解析JSON的方法。
使用ObjectMapper
的一些核心方法:
- writeValue(AsXxx): 用于将对象序列化为JSON,可输出至文件、输出流或者字符串。
- readValue: 用于将JSON字符串、文件或输入流解析为Java对象。
- convertValue: 用于转换不同的数据类型,例如从一种Java对象转换为另一种。
- readTree: 读取JSON内容至一个
JsonNode
树模型,这在灵活处理JSON数据时非常有用。
示例代码
1. 序列化示例
ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person("John Doe", 28);
try {
String json = objectMapper.writeValueAsString(person);
System.out.println(json);
} catch (IOException e) {
e.printStackTrace();
}
2. 反序列化示例
String json = "{\"name\":\"John Doe\",\"age\":28}";
try {
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person.getName());
} catch (IOException e) {
e.printStackTrace();
}
3. JsonNode
处理示例
String jsonData = "{\"name\":\"Jane Doe\",\"age\":25}";
try {
JsonNode node = objectMapper.readTree(jsonData);
String name = node.get("name").asText();
int age = node.get("age").asInt();
System.out.println("Name: " + name + ", Age: " + age);
} catch (IOException e) {
e.printStackTrace();
}
高级配置
ObjectMapper
提供了丰富的配置选项来调整其行为,例如:
- 配置序列化和反序列化的行为:可以通过启用或禁用
SerializationFeature
和DeserializationFeature
枚举中的特性来配置ObjectMapper
的行为。例如,你可以禁用在序列化中将日期作为timestamps。
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
- 自定义属性名:使用注解
@JsonProperty
来定义JSON属性名。
public class Person {
private String name;
@JsonProperty("person_age")
private int age;
// Constructors, getters and setters...
}
- 包含和排除属性:使用
@JsonIgnore
注解来忽略某些属性,或者配置ObjectMapper
只包含非空属性。
objectMapper.setSerializationInclusion(Include.NON_NULL);
- 自定义序列化器和反序列化器:为特定类型创建自定义序列化器或反序列化器。
objectMapper.registerModule(new SimpleModule().addSerializer(new MyCustomSerializer()));
三.各种Node
在Jackson库中,JsonNode
是一个重要的类,用于表示JSON数据的结构化形式。它是一个抽象的、不可变的数据类型,代表JSON数据的节点。以下是Jackson中主要的JsonNode
类型,这些类型映射了JSON数据结构的不同组成部分:
1. ObjectNode
- 表示JSON对象,即键值对的集合。
- 可以通过键(字符串)访问值(
JsonNode
)。
2. ArrayNode
- 表示JSON数组。
- 提供对数组元素的索引访问,每个元素都是一个
JsonNode
。
3. ValueNode
- 是一个抽象类,表示JSON的值节点(非数组和非对象)。
ValueNode
的子类包括:TextualNode
:表示JSON字符串。NumericNode
:表示JSON数字,具体实现包括IntNode
,LongNode
,DoubleNode
等。BooleanNode
:表示JSON布尔值(true
或false
)。BinaryNode
:表示二进制数据。NullNode
:表示JSON的null
值。POJONode
:表示任何Java对象作为一个节点,通常不是标准JSON类型的一部分,但Jackson允许你将任何Java对象作为节点嵌入。
4. MissingNode
- 代表缺失的节点。当访问不存在的字段时,通常返回此类型的节点而不是
null
。 - 这对于避免
NullPointerException
非常有用,并可以链式调用多个方法。
在Jackson的JsonNode类中,asXXX()
方法系列主要用于从不同类型的ValueNode
中安全地提取数据(__value)。这些方法会尝试将节点的值转换为请求的类型,如果节点值不是期望的类型或节点为空,则返回一个默认值(例如,asInt()对于非数值或null节点会返回0)。