前言
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原数据,其中ObjectNode 和 JsonNode 是 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在中小数据量下表现良好,满足大部分常规需求