Java Jackson 库
Jackson 是一个用于 Java 的高性能 JSON 处理库,它能够:
- 将 Java 对象序列化为 JSON 格式(对象 → JSON)
- 将 JSON 反序列化为 Java 对象(JSON → 对象)
Jackson 因其速度快、功能强大且易于使用而成为 Java 生态中最流行的 JSON 处理库之一。
Jackson 核心模块
- 1. Jackson Core:Jackson 的核心模块,提供了基本的 JSON 解析和生成功能。
- 2. Jackson Annotations:包含各种注解,用于控制序列化和反序列化过程。
- 3. Jackson Databind:提供数据绑定功能,可以在 Java 对象和 JSON 之间进行转换。
基本使用方法
添加依赖
首先需要在项目中添加 Jackson 依赖(以 Maven 为例):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
一个简单的例子,将 Java 与 JSON 对象互转:
实例
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonDemo {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Java对象转JSON
Person person = new Person("张三", 30);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// JSON转Java对象
Person parsedPerson = mapper.readValue(json, Person.class);
System.out.println(parsedPerson);
}
}
class Person {
private String name;
private int age;
// 必须有无参构造函数
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 必须有getter和setter
// 省略getter/setter和toString方法
}
public class JacksonDemo {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Java对象转JSON
Person person = new Person("张三", 30);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// JSON转Java对象
Person parsedPerson = mapper.readValue(json, Person.class);
System.out.println(parsedPerson);
}
}
class Person {
private String name;
private int age;
// 必须有无参构造函数
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 必须有getter和setter
// 省略getter/setter和toString方法
}
创建 ObjectMapper
ObjectMapper
是 Jackson 的核心类,负责序列化和反序列化:
ObjectMapper mapper = new ObjectMapper();
JSON 序列化(对象 → JSON)
简单示例
实例
public class Person {
private String name;
private int age;
// 省略构造函数、getter 和 setter
}
Person person = new Person("张三", 25);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// 输出: {"name":"张三","age":25}
private String name;
private int age;
// 省略构造函数、getter 和 setter
}
Person person = new Person("张三", 25);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// 输出: {"name":"张三","age":25}
格式化输出
实例
String prettyJson = mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(person);
System.out.println(prettyJson);
/*
输出:
{
"name" : "张三",
"age" : 25
}
*/
.writeValueAsString(person);
System.out.println(prettyJson);
/*
输出:
{
"name" : "张三",
"age" : 25
}
*/
JSON 反序列化(JSON → 对象)
简单示例
实例
String json = "{\"name\":\"李四\",\"age\":30}";
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName()); // 输出: 李四
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName()); // 输出: 李四
从文件读取
Person person = mapper.readValue(new File("person.json"), Person.class);
常用注解
Jackson 提供了多种注解来控制序列化和反序列化过程:
@JsonProperty
指定 JSON 属性名:
@JsonProperty("user_name") private String name;
@JsonIgnore
忽略某个字段:
@JsonIgnore private String password;
@JsonFormat
格式化日期:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private Date birthDate;
处理复杂类型
集合类型
实例
List people = Arrays.asList(
new Person("王五", 28),
new Person("赵六", 32)
);
String json = mapper.writeValueAsString(people);
// 输出: [{"name":"王五","age":28},{"name":"赵六","age":32}]
new Person("王五", 28),
new Person("赵六", 32)
);
String json = mapper.writeValueAsString(people);
// 输出: [{"name":"王五","age":28},{"name":"赵六","age":32}]
Map 类型
实例
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("age", 25);
data.put("isStudent", true);
String json = mapper.writeValueAsString(data);
// 输出: {"name":"张三","age":25,"isStudent":true}
data.put("name", "张三");
data.put("age", 25);
data.put("isStudent", true);
String json = mapper.writeValueAsString(data);
// 输出: {"name":"张三","age":25,"isStudent":true}
高级特性
自定义序列化/反序列化
通过继承 JsonSerializer
和 JsonDeserializer
可以实现自定义的序列化和反序列化逻辑。
多态类型处理
使用 @JsonTypeInfo
和 @JsonSubTypes
注解处理继承和多态。
树模型
Jackson 提供了树模型 API,可以直接操作 JSON 节点:
实例
JsonNode rootNode = mapper.readTree(json);
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
最佳实践
- 重用 ObjectMapper:创建
ObjectMapper
实例开销较大,应该重用同一个实例 - 处理异常:始终处理
JsonProcessingException
和IOException
- 使用 DTO 模式:不要直接序列化领域模型,使用专门的数据传输对象(DTO)
- 考虑性能:对于高性能场景,可以使用
JsonFactory
进行底层操作
总结
Jackson 是 Java 处理 JSON 的强大工具,提供了:
- 简单易用的 API
- 高性能的 JSON 处理能力
- 丰富的定制选项
- 良好的社区支持
掌握 Jackson 可以大大提高 Java 开发中处理 JSON 数据的效率和灵活性。
点我分享笔记