快速学习和掌握Jackson 、Gson、Fastjson

发布于:2025-09-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

前言

Json数据格式目前已经是前后端交互的主流数据传输格式,我们在日常的Java开发项目中也经常需要在程序中处理json数据,包括序列化以及反序列化,甚至直接操作JSON数据。Spring Boot 提供了对多种 JSON 库的良好支持,其中Jackson 、Gson、Fastjson 日常开发中我们用的比较多,每个库都有其特点和适用场景。

Jackson

  • Jackson是Java生态中最流行且功能最强大的JSON处理库,具备​​高性能​​、​​灵活性​​和​​丰富的功能等特点,是Spring等主流框架的默认JSON处理器,在boot项目中,是通过spring-boot-starter-web 依赖间接引入

核心功能与基本使用

  • Jackson的核心是ObjectMapper类,它负责JSON与Java对象之间的转换工作:
// 初始化ObjectMapper
ObjectMapper mapper = new ObjectMapper();

// 配置常用选项
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性,不设置这个,如果JSON数据包含某个属性,Java类没有这个属性,就会反序列化失败
mapper.setSerializationInclusion(Include.NON_NULL); // 忽略null值

// 对象序列化为JSON字符串
User user = new User("John", 30);
String json = mapper.writeValueAsString(user);

// JSON字符串反序列化为对象
User parsedUser = mapper.readValue(json, User.class);

高级特性

  • Jackson提供了丰富的​​注解​​用于控制序列化/反序列化行为:
// 使用注解控制序列化
@JsonInclude(Include.NON_NULL)  // 忽略null字段
@JsonPropertyOrder({"name", "id"}) // 指定属性顺序
public class User {
    @JsonProperty("user_id") // 自定义JSON字段名
    private String userId;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 日期格式化
    private LocalDateTime createTime;
    
    @JsonIgnore // 忽略该字段
    private String password;
}
  • 对于​​复杂类型和泛型​​,Jackson使用TypeReference处理:
// 处理泛型集合
String jsonList = "[{...}, {...}]";
List<User> users = mapper.readValue(jsonList, new TypeReference<List<User>>() {});

// 复杂嵌套结构
TypeReference<Map<String, List<Order>>> complexType = new TypeReference<>() {};
Map<String, List<Order>> result = mapper.readValue(json, complexType);
  • 我们也可以通过Jackson的​​树模型API​​(JsonNode)动态操作JSON原数据,其中ObjectNodeJsonNode 是 Jackson 库中处理 JSON 数据的两个核心类
  • JsonNode使抽象基类,ObjectNode是JsonNode的继承子类
  • JsonNode不可变,只能获取,ObjectNode可以改变JSON数据值,提供了 put, remove, set 等修改方法
// 使用树模型动态操作JSON
JsonNode rootNode = mapper.readTree(jsonString);
String name = rootNode.get("name").asText(); // 提取值
int age = rootNode.get("age").asInt();

// 修改JSON节点
ObjectNode objectNode = (ObjectNode) rootNode;
objectNode.put("newField", "newValue");
String modifiedJson = objectNode.toString();

Gson

  • Gson是Google开发的一个​​轻量级​​、​​易用​​的JSON库,以其简单的API和零依赖特性而受到欢迎

基本用法

  • Gson的核心是Gson类,它负责JSON与Java对象之间的转换工作
// 创建Gson实例
Gson gson = new Gson();

// 对象序列化为JSON
User user = new User("John", 30);
String json = gson.toJson(user);

// JSON反序列化为对象
User parsedUser = gson.fromJson(json, User.class);
  • Gson对​​复杂对象和嵌套结构​​的处理也很简便:
// 处理集合类型
String jsonArray = "[{...}, {...}]";
List<User> users = gson.fromJson(jsonArray, new TypeToken<List<User>>(){}.getType());
  • Gson的​​注解系统​​虽然比Jackson简单,但覆盖了常见需求:
public class User {
    @SerializedName("full_name") // JSON字段名映射
    private String name;
    
    @Expose(serialize = false, deserialize = true) // 控制序列化/反序列化行为
    private String password;
    
    @Since(1.1) // 版本控制
    private String email;
}

Fastjson

  • Fastjson是阿里巴巴开发的​​高性能​​JSON库,号称Java领域中最快的JSON库

基本使用

Fastjson的核心功能通过JSON类提供:

// 对象序列化为JSON字符串
User user = new User("John", 30);
String jsonString = JSON.toJSONString(user);

// 格式化输出
String prettyJson = JSON.toJSONString(user, true);

// JSON字符串反序列化为对象
User parsedUser = JSON.parseObject(jsonString, User.class);

// 处理集合
List<User> userList = JSON.parseArray(jsonArrayString, User.class);

-Fastjson提供了方便的​​JSON对象模型​​:

// JSON字符串和JSONObject 互相转换,通过JSONObject可以很方便操作JSON数据
JSONObject jo = JSON.parseObject(jsonString);
String jsonString = JSON.toJSONString(jo);
// 直接操作JSON对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "John");
jsonObject.put("age", 30);

// 获取值
String name = jsonObject.getString("name");
int age = jsonObject.getIntValue("age");

// 判断键是否存在
boolean hasKey = jsonObject.containsKey("name");
  • Fastjson也支持通过注解​​自定义序列化​​:
// 使用@JSONField注解配置序列化
public class User {
    @JSONField(name = "user_name", ordinal = 1) // ordinal属性作用是控制该字段在序列化字段的顺序
    private String name;
    
    @JSONField(serialize = false) // 不序列化此字段
    private String password;
    
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}

选用建议

  • 对于大多数应用,三个库的性能差异可能并不明显。但在​​大数据量和高并发场景​​下:
  • Fastjson通常表现出最快的序列化/反序列化速度
  • Jackson在高并发下表现稳定,适合企业级应用
  • Gson在中小数据量下表现良好,满足大部分常规需求