如何通过路径字符串修改Jackson JsonNode/ObjectNode的深层值?
使用路径字符串直接修改Jackson JsonNode/ObjectNode的深层值
当然可以实现这种便捷的路径式修改,Jackson本身就提供了对应的工具类,不需要手动遍历JSON树。
原生Jackson方案:JsonPointer + ObjectNode
Jackson的JsonPointer专门用来处理JSON的路径定位,配合可变的ObjectNode,可以直接通过路径字符串修改深层值,无需逐层调用get()。
代码示例
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.core.JsonPointer; public class JsonPathUpdateDemo { public static void main(String[] args) throws Exception { // 原始JSON字符串 String originalJson = "{\"deep\":{\"path\":{\"to\":\"value\"}}}"; ObjectMapper mapper = new ObjectMapper(); // 解析为JsonNode,再转为可变的ObjectNode(JsonNode本身不可变) JsonNode rootNode = mapper.readTree(originalJson); ObjectNode rootObject = (ObjectNode) rootNode; // 用路径创建JsonPointer,格式为"/deep/path/to" JsonPointer pathPointer = JsonPointer.compile("/deep/path/to"); // 直接设置新值 rootObject.set(pathPointer, mapper.valueToTree("otherValue")); // 输出修改后的JSON System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootObject)); } }
封装成你想要的便捷写法
如果你习惯用deep/path/to这种不带前置斜杠的路径格式,可以自己封装一个工具方法,简化调用:
/** * 便捷修改ObjectNode深层值 * @param node 要修改的ObjectNode根节点 * @param path 路径字符串,如"deep/path/to" * @param value 要设置的新值 * @param mapper ObjectMapper实例 */ public static void put(ObjectNode node, String path, Object value, ObjectMapper mapper) { // 转换为JsonPointer要求的格式:前置加斜杠 String pointerPath = "/" + path; JsonPointer pointer = JsonPointer.compile(pointerPath); node.set(pointer, mapper.valueToTree(value)); } // 调用示例 put(rootObject, "deep/path/to", "otherValue", mapper);
注意事项
- JsonNode不可变:必须将解析后的JsonNode转为
ObjectNode才能进行修改操作,因为基础的JsonNode是只读的。 - 路径格式适配:如果习惯用其他分隔符(比如
.),可以在工具方法里做替换,比如把deep.path.to转成/deep/path/to再创建JsonPointer。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

