Java中常用的JSON处理库介绍与示例:Jackson、Gson、Fastjson的基础知识与对比

495 阅读4分钟

在Java开发中,JSON(JavaScript Object Notation)是一种非常流行的数据交换格式。处理JSON数据时,常用的Java库主要有Jackson、Gson和Fastjson。下面用最简单的方式介绍这几个库的基础知识、优缺点,并附上示例代码,帮助大家快速理解和使用。


1. 什么是JSON处理库?

JSON处理库的作用是:

  • 将Java对象转换成JSON字符串(序列化)
  • 将JSON字符串转换成Java对象(反序列化)

这让Java程序能够方便地与前端或其他系统交换数据。


2. 常见的Java JSON库及特点

库名开发者主要特点适用场景性能表现安全性
JacksonFasterXML功能强大,支持注解,性能优异,支持复杂数据大型项目、企业级应用,Spring默认支持性能优于Gson和Fastjson,适合大数据量安全性较好,社区维护积极
GsonGoogle简单易用,文档完善,支持泛型,适合快速开发中小型项目,快速开发性能中等,足够大多数应用安全性好,开源稳定
Fastjson阿里巴巴解析速度快,功能丰富,支持JSONPath等高级功能对性能极致要求的场景性能优秀,尤其是大数据处理过去有安全漏洞,需使用新版或开启安全模式

其中,Jackson和Gson是目前最常用的替代Fastjson的方案


3. 详细介绍与代码示例

3.1 Jackson

  • 特点:支持注解控制序列化行为,支持树模型和流式API,性能好,Spring框架默认使用。
  • Maven依赖
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.17.2</version>
</dependency>
  • 简单示例
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class JacksonExample {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        // JSON字符串
        String json = "{"name":"张三","age":28}";

        // 反序列化:JSON转Java对象
        Person person = mapper.readValue(json, Person.class);
        System.out.println("姓名:" + person.getName());
        System.out.println("年龄:" + person.getAge());

        // 序列化:Java对象转JSON
        String jsonString = mapper.writeValueAsString(person);
        System.out.println("JSON字符串:" + jsonString);
    }
}

class Person {
    private String name;
    private int age;

    // 需要无参构造器和getter/setter
    public Person() {}
    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; }
}
  • 说明:Jackson的ObjectMapper是核心类,支持将JSON字符串转换为Java对象,也支持反向操作

3.2 Gson

  • 特点:API简单,支持泛型,适合快速开发,Google维护。
  • Maven依赖
<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.8</version>
</dependency>
  • 简单示例
import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {
        Gson gson = new Gson();

        // Java对象
        Person person = new Person("李四", 35);

        // 序列化
        String json = gson.toJson(person);
        System.out.println("JSON字符串:" + json);

        // 反序列化
        Person person2 = gson.fromJson(json, Person.class);
        System.out.println("姓名:" + person2.getName());
        System.out.println("年龄:" + person2.getAge());
    }
}

class Person {
    private String name;
    private int age;

    public Person() {}
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
}
  • 说明:Gson不需要注解,默认映射简单直观,适合中小项目和快速开发

3.3 Fastjson

  • 特点:阿里巴巴开发,性能极佳,支持复杂对象和JSONPath,历史上存在安全漏洞。
  • Maven依赖(推荐使用最新版Fastjson 2.x):
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>2.0.31</version>
</dependency>
  • 简单示例
import com.alibaba.fastjson2.JSON;

public class FastjsonExample {
    public static void main(String[] args) {
        Person person = new Person("王五", 40);

        // 序列化
        String json = JSON.toJSONString(person);
        System.out.println("JSON字符串:" + json);

        // 反序列化
        Person person2 = JSON.parseObject(json, Person.class);
        System.out.println("姓名:" + person2.getName());
        System.out.println("年龄:" + person2.getAge());
    }
}

class Person {
    private String name;
    private int age;

    public Person() {}
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
}
  • 安全提醒:Fastjson历史上存在远程代码执行漏洞,建议使用最新版本(>=1.2.83)并开启安全模式,或者考虑Jackson/Gson替代

4. 性能和使用建议

  • 性能对比(基于多个测试):

    • 小数据量(<100KB):Gson性能较好,启动快,适合快速开发。
    • 中等数据量(100KB~1MB):三者性能相近。
    • 大数据量(>1MB):Jackson和Fastjson性能更优且稳定,适合复杂业务和大数据处理15
  • 安全性

    • Fastjson曾多次曝出安全漏洞,尤其是AutoType功能,存在反序列化风险。
    • Jackson和Gson安全性较好,社区维护活跃,推荐在安全要求高的项目中使用。
  • 易用性

    • Gson最简单,上手快。
    • Jackson功能最强,学习曲线稍陡,但适合复杂需求。
    • Fastjson功能丰富,但需注意安全配置。

5. 总结

库名优点缺点适用建议
Jackson功能丰富,性能好,生态完善学习曲线较陡企业级、大型复杂项目
Gson简单易用,文档好,支持泛型性能一般,功能相对简单中小项目,快速开发
Fastjson性能优异,功能丰富过去安全漏洞较多,需谨慎使用性能要求极高且能严格控制安全风险的项目

通过以上介绍和示例代码,大家可以根据项目需求选择合适的JSON处理库。建议新项目优先考虑Jackson或Gson,Fastjson需使用最新版本并开启安全模式。


附加示例:如何在Spring Boot项目中使用Jackson

Spring Boot默认集成了Jackson,示例:

@RestController
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        return new User("张三", 30);
    }
}

class User {
    private String name;
    private int age;

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

访问/user接口,Spring Boot会自动将User对象转换成JSON返回。


以上内容帮助你快速理解Java中主流JSON库的基础知识、优缺点及使用方法。选择合适的库,将让你的开发更高效、安全。