Java Jackson 库

Java 常用类库 Java 常用类库


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>

一个简单的例子,将 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方法
}

创建 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}

格式化输出

实例

String prettyJson = mapper.writerWithDefaultPrettyPrinter()
                         .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(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}]

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}

高级特性

自定义序列化/反序列化

通过继承 JsonSerializerJsonDeserializer 可以实现自定义的序列化和反序列化逻辑。

多态类型处理

使用 @JsonTypeInfo@JsonSubTypes 注解处理继承和多态。

树模型

Jackson 提供了树模型 API,可以直接操作 JSON 节点:

实例

JsonNode rootNode = mapper.readTree(json);
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();

最佳实践

  1. 重用 ObjectMapper:创建 ObjectMapper 实例开销较大,应该重用同一个实例
  2. 处理异常:始终处理 JsonProcessingExceptionIOException
  3. 使用 DTO 模式:不要直接序列化领域模型,使用专门的数据传输对象(DTO)
  4. 考虑性能:对于高性能场景,可以使用 JsonFactory 进行底层操作

总结

Jackson 是 Java 处理 JSON 的强大工具,提供了:

  • 简单易用的 API
  • 高性能的 JSON 处理能力
  • 丰富的定制选项
  • 良好的社区支持

掌握 Jackson 可以大大提高 Java 开发中处理 JSON 数据的效率和灵活性。

Java 常用类库 Java 常用类库