ObjectMapper 和 ObjectNode

该文章已生成可运行项目,

ObjectMapperObjectNodeJackson 库中最核心、最常用的两个类,理解它们几乎等于掌握了 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 与对象转换的核心类

 定义

ObjectMapperJackson 的核心对象

用于执行 JSON 与 Java 对象之间的 序列化(对象 → JSON)反序列化(JSON → 对象)


常用功能

功能方法示例
对象 → JSON字符串writeValueAsString(obj)mapper.writeValueAsString(user)
JSON字符串 → 对象readValue(json, Class<T>)mapper.readValue(json, User.class)
JSON字符串 → MapreadValue(json, Map.class)mapper.readValue(json, Map.class)
JSON字符串 → ListreadValue(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()美化打印 JSONSystem.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 的关系

对比项ObjectMapperObjectNode
类型工具类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

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值