ObjectMapper 和 ObjectNode 是 Jackson 库中最核心、最常用的两个类,理解它们几乎等于掌握了 Java JSON 处理的 90%。
一、Jackson 简介
Jackson 是目前 Java 领域使用最广泛的 JSON 处理库,常见包名:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
它支持:
- Java 对象 ↔ JSON 字符串
- JSON 结构的动态创建与修改
- 流式解析、树形解析、数据绑定等多种模式
二、ObjectMapper —— JSON 与对象转换的核心类
定义
ObjectMapper 是 Jackson 的核心对象,
用于执行 JSON 与 Java 对象之间的 序列化(对象 → JSON) 和 反序列化(JSON → 对象)。
常用功能
| 功能 | 方法 | 示例 |
|---|---|---|
| 对象 → JSON字符串 | writeValueAsString(obj) | mapper.writeValueAsString(user) |
| JSON字符串 → 对象 | readValue(json, Class<T>) | mapper.readValue(json, User.class) |
| JSON字符串 → Map | readValue(json, Map.class) | mapper.readValue(json, Map.class) |
| JSON字符串 → List | readValue(json, new TypeReference<List<T>>() {}) | — |
| 对象 → JSON 文件 | writeValue(file, obj) | 保存为文件 |
| JSON 文件 → 对象 | readValue(file, Class<T>) | 从文件读取 |
| 树模型读取 | readTree(json) | 返回 JsonNode |
| 树模型写入 | createObjectNode() | 创建可操作 JSON 节点 |
示例
ObjectMapper mapper = new ObjectMapper();
// Java 对象转 JSON
User user = new User("张三", 25);
String json = mapper.writeValueAsString(user);
System.out.println(json);
// 输出:{"name":"张三","age":25}
// JSON 转 Java 对象
String jsonStr = "{\\"name\\":\\"李四\\",\\"age\\":30}";
User user2 = mapper.readValue(jsonStr, User.class);
System.out.println(user2.getName()); // 输出:李四
常见配置(可链式)
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 字段
mapper.enable(SerializationFeature.INDENT_OUTPUT); // 格式化输出
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 忽略未知字段
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 时间格式化
三、ObjectNode —— 可编辑的 JSON 对象节点
定义
ObjectNode 是 Jackson 的 树模型 API(Tree Model) 的一部分,
类似于一个可编辑的 JSON 对象。
它允许:
- 动态创建 JSON 对象
- 动态添加 / 修改 / 删除属性
- 嵌套结构操作
ObjectNode 继承自 JsonNode,是“可变”的(Mutable),
而 JsonNode 本身是“只读”的。
创建 ObjectNode
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
常用方法
| 方法 | 说明 | 示例 |
|---|---|---|
put(String field, T value) | 添加基本类型字段 | node.put("name", "张三") |
putObject(String field) | 添加子对象 | ObjectNode addr = node.putObject("address") |
putArray(String field) | 添加数组字段 | ArrayNode arr = node.putArray("tags") |
remove(String field) | 删除字段 | node.remove("age") |
set(String field, JsonNode value) | 设置复杂字段 | node.set("info", anotherNode) |
get(String field) | 获取字段值 | node.get("name").asText() |
toPrettyString() | 美化打印 JSON | System.out.println(node.toPrettyString()) |
示例
ObjectMapper mapper = new ObjectMapper();
ObjectNode userNode = mapper.createObjectNode();
// 添加属性
userNode.put("name", "张三");
userNode.put("age", 25);
userNode.put("isAdmin", false);
// 添加嵌套对象
ObjectNode addressNode = userNode.putObject("address");
addressNode.put("city", "北京");
addressNode.put("zip", "100000");
// 添加数组
userNode.putArray("roles").add("admin").add("editor");
// 打印结果
System.out.println(userNode.toPrettyString());
输出:
{
"name" : "张三",
"age" : 25,
"isAdmin" : false,
"address" : {
"city" : "北京",
"zip" : "100000"
},
"roles" : [ "admin", "editor" ]
}
四、ObjectMapper 与 ObjectNode 的关系
| 对比项 | ObjectMapper | ObjectNode |
|---|---|---|
| 类型 | 工具类 | JSON 节点类 |
| 作用 | 执行序列化 / 反序列化 / 创建节点 | 表示和操作 JSON 对象 |
| 可修改性 | 不适用 | 可增删改属性 |
| 常见用途 | 对象 ↔ JSON 转换 | 动态构造 JSON |
| 关系 | 通过 ObjectMapper.createObjectNode() 创建 | 被 ObjectMapper 创建和操作 |
五、结合使用示例
把对象转换为 ObjectNode 并修改
User user = new User("张三", 25);
ObjectMapper mapper = new ObjectMapper();
// 对象转为树模型
ObjectNode node = mapper.valueToTree(user);
// 动态添加字段
node.put("role", "admin");
// 转回 JSON
String json = mapper.writeValueAsString(node);
System.out.println(json);
输出:
{"name":"张三","age":25,"role":"admin"}
从 JSON 字符串读取成 ObjectNode 并动态操作
String json = "{\\"name\\":\\"李四\\",\\"age\\":30}";
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = (ObjectNode) mapper.readTree(json);
node.put("age", 31);
node.put("city", "上海");
System.out.println(mapper.writeValueAsString(node));
输出:
{"name":"李四","age":31,"city":"上海"}
六、配合 ArrayNode 使用(数组节点)
ArrayNode arr = mapper.createArrayNode();
arr.add("Java").add("Python").add("Go");
ObjectNode user = mapper.createObjectNode();
user.put("name", "张三");
user.set("skills", arr);
System.out.println(user.toPrettyString());
输出:
{
"name" : "张三",
"skills" : [ "Java", "Python", "Go" ]
}
七、总结表格
| 类名 | 类型 | 主要用途 | 可修改性 | 常用方法 |
|---|---|---|---|---|
ObjectMapper | 工具类 | 序列化、反序列化、读写文件、创建节点 | 不可修改 JSON 本身 | writeValueAsString, readValue, readTree, createObjectNode |
ObjectNode | 数据类 | 表示一个 JSON 对象节点,支持动态增删改 | 可修改 | put, get, set, remove, putArray |

5258

被折叠的 条评论
为什么被折叠?



