当前位置: 首页 > news >正文

Jackson 详解

目录

前言

        Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介绍 Jackson 的核心模块、使用方法、注意事项以及代码示例。

1. Jackson 的核心模块

2. 使用 Jackson

2.1 添加依赖

2.2 核心类:ObjectMapper

2.3 基本使用

序列化

反序列化:

3. 使用注解

3.1 常用注解

3.2 示例代码

4. 高级用法

4.1 处理复杂对象

4.2 自定义序列化和反序列化

4.3 处理多态类型

5. 注意事项

6. 总结


前言

        Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介绍 Jackson 的核心模块、使用方法、注意事项以及代码示例。

1. Jackson 的核心模块

Jackson 采用模块化设计,核心模块包括:

  1. jackson-core
    • 提供底层 JSON 解析和生成功能。
    • 包含 JsonParser(解析 JSON)和 JsonGenerator(生成 JSON)。
  2. jackson-annotations
    • 提供丰富的注解,用于控制 JSON 的序列化和反序列化行为。
  3. jackson-databind
    • 提供高级数据绑定功能,将 JSON 数据与 Java 对象相互转换。
  4. jackson-dataformat-xml
    • 支持 XML 格式的序列化和反序列化。
  5. jackson-dataformat-yaml
    • 支持 YAML 格式的序列化和反序列化。

2. 使用 Jackson

2.1 添加依赖

在 Maven 项目中,添加以下依赖:

<dependencies>
    <!-- Jackson 核心模块 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
    </dependency>
    <!-- 可选:支持 XML -->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.13.3</version>
    </dependency>
    <!-- 可选:支持 YAML -->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.13.3</version>
    </dependency>
</dependencies>

2.2 核心类:ObjectMapper

ObjectMapper 是 Jackson 的核心类,用于实现 JSON 与 Java 对象的相互转换。以下是其常用方法:

方法描述
writeValueAsString(Object)将 Java 对象序列化为 JSON 字符串。
readValue(String, Class)将 JSON 字符串反序列化为 Java 对象。
writeValue(File, Object)将 Java 对象序列化到文件中。
readValue(File, Class)从文件中反序列化 JSON 数据。

2.3 基本使用

序列化
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
    public static void main(String[] args) throws Exception {
        User user = new User("John", 30);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);
        System.out.println(json); // 输出: {"name":"John","age":30}
    }
}
class User {
    private String name;
    private int age;
    // 构造函数、Getter 和 Setter
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}
反序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // 输出: John
        System.out.println(user.getAge());  // 输出: 30
    }
}

3. 使用注解

Jackson 提供了丰富的注解,用于控制 JSON 的序列化和反序列化行为。

3.1 常用注解

注解描述
@JsonProperty指定 JSON 字段的名称。
@JsonIgnore忽略字段,不参与序列化和反序列化。
@JsonFormat指定日期、时间等字段的格式化方式。
@JsonInclude控制字段在序列化时的包含规则(如非空字段才序列化)。
@JsonCreator指定反序列化时的构造函数或工厂方法。
@JsonAlias为字段指定多个 JSON 别名,反序列化时可以匹配多个名称。

3.2 示例代码

import com.fasterxml.jackson.annotation.*;
public class User {
    @JsonProperty("user_name")
    private String name;
    @JsonIgnore
    private String password;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthDate;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String email;
    // 构造函数、Getter 和 Setter
}

4. 高级用法

4.1 处理复杂对象

Jackson 支持嵌套对象、集合和映射的序列化和反序列化。

class Address {
    private String city;
    private String street;
    // 构造函数、Getter 和 Setter
}
class User {
    private String name;
    private List<Address> addresses;
    // 构造函数、Getter 和 Setter
}

4.2 自定义序列化和反序列化

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

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
@JsonSerialize(using = CustomSerializer.class)
class User {
    private String name;
    // 构造函数、Getter 和 Setter
}
class CustomSerializer extends JsonSerializer<User> {
    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("user_name", user.getName());
        gen.writeEndObject();
    }
}

4.3 处理多态类型

使用 @JsonTypeInfo@JsonSubTypes 处理多态类型。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
abstract class Animal {
    private String name;
    // 构造函数、Getter 和 Setter
}
class Dog extends Animal {
    private String breed;
    // 构造函数、Getter 和 Setter
}
class Cat extends Animal {
    private boolean likesCream;
    // 构造函数、Getter 和 Setter
}

5. 注意事项

  1. 性能优化
    • 重用 ObjectMapper 实例,避免重复创建。
  2. 安全性
    • 反序列化时,避免直接反序列化不可信的 JSON 数据,防止反序列化攻击。
  3. 版本兼容性
    • 确保 jackson-corejackson-annotations 和 jackson-databind 的版本一致。
  4. 空值处理
    • 使用 @JsonInclude(JsonInclude.Include.NON_NULL) 忽略空值字段。

补充:

1. JSON处理库的作用

1.1 Fastjson

Fastjson是阿里巴巴开源的高性能JSON库,主要用于Java对象与JSON字符串之间的序列化反序列化。它支持复杂对象的处理,包括嵌套对象、泛型、集合等,广泛应用于高性能场景。

1.2 org.json

org.json是一个轻量级的JSON处理库,提供了JSON的解析、生成和操作功能。它的API设计简单,适合初学者和快速开发场景。

1.3 json-simple

json-simple是一个简单的JSON处理库,专注于基本的JSON解析和生成。它的API设计非常简洁,适合快速处理简单的JSON数据。


2. 技术原理

2.1 Fastjson

Fastjson的核心技术包括:

  • 高性能解析:通过优化算法和数据结构,Fastjson在解析JSON时速度非常快。
  • 动态类型处理:支持复杂对象的序列化和反序列化,包括泛型、嵌套对象等。
  • 自定义序列化:允许开发者通过注解或自定义序列化器控制JSON的生成和解析。

2.2 org.json

org.json的核心技术包括:

  • 轻量级设计:库的体积较小,适合资源有限的环境。
  • 简单API:提供了JSONObject和JSONArray等核心类,易于上手。
  • 功能齐全:支持JSON的解析、生成和操作。

2.3 json-simple

json-simple的核心技术包括:

  • 简洁API:提供了JSONObject和JSONArray等核心类,API设计非常简洁。
  • 轻量级设计:库的体积较小,适合快速开发场景。
  • 基础功能:支持基本的JSON解析和生成。

3. 示例代码与输出结果

3.1 Fastjson示例

代码:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class FastjsonExample {
    public static void main(String[] args) {
        // 将Java对象转换为JSON字符串
        User user = new User("John", 30);
        String jsonString = JSON.toJSONString(user);
        System.out.println("Fastjson - JSON String: " + jsonString);

        // 将JSON字符串转换为Java对象
        User parsedUser = JSON.parseObject(jsonString, User.class);
        System.out.println("Fastjson - Parsed User: " + parsedUser);

        // 操作JSON对象
        JSONObject jsonObject = JSON.parseObject(jsonString);
        jsonObject.put("age", 31);
        System.out.println("Fastjson - Updated JSON: " + jsonObject.toJSONString());
    }
}

class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and Setters
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}

 输出结果:

Fastjson - JSON String: {"age":30,"name":"John"}
Fastjson - Parsed User: User{name='John', age=30}
Fastjson - Updated JSON: {"age":31,"name":"John"}

3.2 org.json示例

代码:

import org.json.JSONObject;

public class OrgJsonExample {
    public static void main(String[] args) {
        // 创建JSON对象
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "John");
        jsonObject.put("age", 30);
        System.out.println("org.json - JSON Object: " + jsonObject);

        // 从JSON字符串解析JSON对象
        String jsonString = "{\"name\":\"John\",\"age\":30}";
        JSONObject parsedJsonObject = new JSONObject(jsonString);
        System.out.println("org.json - Parsed JSON Object: " + parsedJsonObject);

        // 操作JSON对象
        parsedJsonObject.put("age", 31);
        System.out.println("org.json - Updated JSON Object: " + parsedJsonObject);
    }
}

 输出结果:

org.json - JSON Object: {"name":"John","age":30}
org.json - Parsed JSON Object: {"name":"John","age":30}
org.json - Updated JSON Object: {"name":"John","age":31}

3.3 json-simple示例

代码:

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class JsonSimpleExample {
    public static void main(String[] args) throws Exception {
        // 创建JSON对象
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "John");
        jsonObject.put("age", 30);
        System.out.println("json-simple - JSON Object: " + jsonObject.toJSONString());

        // 从JSON字符串解析JSON对象
        String jsonString = "{\"name\":\"John\",\"age\":30}";
        JSONParser parser = new JSONParser();
        JSONObject parsedJsonObject = (JSONObject) parser.parse(jsonString);
        System.out.println("json-simple - Parsed JSON Object: " + parsedJsonObject);

        // 操作JSON对象
        parsedJsonObject.put("age", 31);
        System.out.println("json-simple - Updated JSON Object: " + parsedJsonObject.toJSONString());
    }
}

输出结果:

json-simple - JSON Object: {"name":"John","age":30}
json-simple - Parsed JSON Object: {"name":"John","age":30}
json-simple - Updated JSON Object: {"name":"John","age":31}

 

4. 对比与总结

特性Fastjsonorg.jsonjson-simple
性能高性能,适合大数据量处理性能一般性能一般
功能性功能强大,支持复杂对象功能齐全功能基础
易用性API设计简单,易于上手API设计简单,适合初学者API设计简洁,快速上手
体积较大较小较小

结论:

  • 如果需要处理大量的JSON数据,并且对性能有较高要求,Fastjson 是最佳选择。
  • 如果需要一个轻量级且功能齐全的JSON库,org.json 是一个不错的选择。
  • 如果只需要快速处理简单的JSON数据,json-simple 是最简单的选择。

5. 注意事项

  • Fastjson的安全性:Fastjson在过去曾被发现存在一些安全漏洞,建议使用最新版本并关注官方更新。
  • 库的选择:根据项目需求和开发环境选择合适的JSON库,避免过度依赖单一库。

使用前导入对应的库:

6. 总结

Jackson 是 Java 生态中最强大的 JSON 处理库,提供了高效、灵活的序列化和反序列化功能。通过合理使用注解和高级特性,可以满足各种复杂的 JSON 处理需求。无论是 RESTful API、数据存储还是数据传输,Jackson 都是不可或缺的工具。

相关文章:

  • 三、OpenGL中三角形的绘制
  • Web前端开发——HTML基础下
  • µCOS-III从入门到精通 第十章(µC/OS-III消息队列)
  • “国产AI之光”Manus,会成为下一个DeepSeek吗?
  • RHCE9.0版本笔记5:防火墙的本地/远程登录方式
  • linux查看python版本
  • conda 配置新环境时package will be install 和 package will be download 的区别
  • [Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III
  • p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳
  • MySQL如何给其他账号分配权限?
  • Java基础系列:深入理解八大基本数据类型及避坑指南
  • python 程序一次启动有两个进程的问题(flask)
  • Jetpack Compose — 入门实践
  • 完全日期(日期枚举问题)--- 数学性质题型
  • Linux系统重置密码
  • Kubernetes中的微服务
  • 报表DSL优化,享元模式优化过程,优化效果怎么样?
  • SpringCloud——Consul服务注册与发现
  • powershell@宝塔面板批量建站脚本@批量设置@批量部署伪静态设置
  • 【AD】5-12 Object元素的隐藏与显示
  • 网站建设项目进展情况/一个新产品怎么推广
  • 人力招聘网站建设目的/网站网络推广优化
  • 水利网站建设管理汇报/宁波靠谱营销型网站建设
  • 上海建设网站是国家级吗/品牌seo如何优化
  • 宜州做网站/360建网站
  • 做电影网站哪个服务器好/百度竞价托管一月多少钱