Java使用JSONPatch更新JSON字段时路径/被转义为~1如何解决?
问题根因
你遇到的转义异常本质是JsonPointer.of()方法的用法错误:
当你给of()方法传入完整的"/config/version"字符串时,该方法会把整个字符串识别为单个JSON属性名,而非由/分隔的多级路径,因此会自动将属性名中包含的/统一转义为~1,最终生成错误的/~1config~1version路径。
你手动把/替换为~1后再传入of()方法,方法又会把你手动加的~转义为~0,自然就出现了/~01config~01version的二次转义问题。
解决方案
有两种常用的正确写法可选:
方法1:传入路径分段参数
JsonPointer.of()方法支持传入多级路径的分段字符串,不需要加前缀/,方法会自动拼接为合法JSON Pointer:
// 对应路径 /config/version JsonPointer versionPointer = JsonPointer.of("config", "version"); JsonPatch jsonPatch = new JsonPatch( Arrays.asList( new ReplaceOperation(versionPointer, new TextNode("436_605_83.0.0")) ) );
方法2:调用路径字符串解析方法
如果要直接传入带/的完整路径字符串,不要用of()方法,改用对应库的路径解析方法:
- 如果用的是
javax.json官方API:调用JsonPointer.createPointer("/config/version") - 如果用的是
fasterxml.jackson的JsonPointer实现:调用JsonPointer.compile("/config/version")
// 以jackson实现为例 JsonPointer versionPointer = JsonPointer.compile("/config/version"); JsonPatch jsonPatch = new JsonPatch( Arrays.asList( new ReplaceOperation(versionPointer, new TextNode("436_605_83.0.0")) ) );
两种写法最终生成的JSON Patch都符合预期:
[{"op":"replace","path":"/config/version","value":"436_605_83.0.0"}]
内容的提问来源于stack exchange,提问作者Swapnil Kotwal
相关产品推荐
相关产品推荐

