简介
在 Java 生态系统中,Jackson 是最流行的 JSON 解析和序列化库之一。它提供了高效、灵活的 API,用于将 Java 对象转换为 JSON(序列化)以及将 JSON 转换回 Java 对象(反序列化)。Jackson 具有优异的性能,并且支持复杂对象、流式处理、树形模型等功能,使其成为 JSON 处理的首选库。
目录
- Jackson 介绍
- Jackson 依赖
- Jackson 核心功能
- 序列化 Java 对象为 JSON
- 反序列化 JSON 为 Java 对象
- 处理 JSON 树结构
- 使用注解自定义 JSON 解析
- Jackson 高级特性
- 自定义序列化和反序列化
- 处理未知字段
- JSON 视图(View)
- 流式 JSON 处理
- 最佳实践
- 总结
- 参考资料
1. Jackson 介绍
Jackson 是由 FasterXML 维护的开源 JSON 处理库,提供以下模块:
- jackson-core:核心 API,用于 JSON 解析和生成
- jackson-databind:数据绑定 API,提供 POJO <-> JSON 转换功能
- jackson-annotations:用于 JSON 序列化和反序列化的注解支持
除了标准 JSON 处理外,Jackson 还支持 YAML、XML、CBOR 和 MessagePack 等格式。
2. Jackson 依赖
在 Maven 项目中,可以通过以下依赖引入 Jackson:
<dependencies>
<!-- 核心 Jackson 依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
</dependencies>
对于 Gradle:
dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.0'
}
3. Jackson 核心功能
3.1 序列化 Java 对象为 JSON
import com.fasterxml.jackson.databind.ObjectMapper;
class User {
public String name;
public int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class JacksonExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("张三", 25);
// 转换为 JSON
String jsonString = objectMapper.writeValueAsString(user);
System.out.println(jsonString);
}
}
输出:
{"name":"张三","age":25}
3.2 反序列化 JSON 为 Java 对象
public class DeserializeExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"name\":\"李四\",\"age\":30}";
User user = objectMapper.readValue(json, User.class);
System.out.println("姓名: " + user.name + ", 年龄: " + user.age);
}
}
输出:
姓名: 李四, 年龄: 30
3.3 处理 JSON 树结构
Jackson 提供了 JsonNode
解析树形结构 JSON 数据:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTreeExample {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"王五\",\"age\":28}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(json);
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
System.out.println("姓名: " + name + ", 年龄: " + age);
}
}
3.4 使用注解自定义 JSON 解析
Jackson 提供多种注解控制 JSON 序列化和反序列化行为:
@JsonIgnore
:忽略字段@JsonProperty
:自定义 JSON 字段名@JsonFormat
:格式化日期字段
示例:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
class Person {
@JsonProperty("full_name")
public String name;
@JsonIgnore
public int age;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date birthDate;
public Person(String name, int age, Date birthDate) {
this.name = name;
this.age = age;
this.birthDate = birthDate;
}
}
4. Jackson 高级特性
4.1 自定义序列化和反序列化
使用 JsonSerializer
和 JsonDeserializer
可自定义 JSON 处理逻辑:
自定义序列化:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
class CustomSerializer extends JsonSerializer<Integer> {
@Override
public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value + " 岁");
}
}
4.2 处理未知字段
Jackson 默认会抛出异常,但可以使用 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
关闭:
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
4.3 JSON 视图(View)
使用 @JsonView
为不同的场景生成不同的 JSON 视图:
class Views {
static class Public {}
static class Internal extends Public {}
}
class Product {
@JsonView(Views.Public.class)
public String name;
@JsonView(Views.Internal.class)
public double price;
}
5. 最佳实践
- 优先使用 POJO 绑定,避免手动解析 JSON 字符串
- 启用
FAIL_ON_UNKNOWN_PROPERTIES
,防止未定义字段导致错误 - 使用
@JsonIgnoreProperties(ignoreUnknown = true)
处理未知字段 - 考虑
@JsonView
以支持不同场景的 JSON 视图 - 使用
ObjectMapper
作为单例 以提高性能
6. 总结
Jackson 是 Java 中最强大的 JSON 处理库之一,提供多种序列化和反序列化方式,并支持流式处理、自定义转换和 JSON 视图等高级特性。掌握 Jackson 的使用,可以极大提升 Java 项目的 JSON 处理能力。
7. 参考资料
这样,你就掌握了 Java Jackson 处理 JSON 的完整流程!🚀