zjsonpatch库add操作返回结果如何转换为单字段扁平结构?
关于zjsonpatch操作结果扁平化的实现方法
可以实现你需要的扁平结构,zjsonpatch原生没有提供对应的输出配置,你可以在拿到库返回的操作结果后,自行对结果做二次转换即可。
核心实现逻辑
- 遍历所有返回的JSON Patch操作节点
- 针对
add/replace操作,判断value的类型:如果是基础类型(字符串、数字、布尔、null)或数组类型,直接保留原操作;如果是键值对对象类型,递归遍历该对象的所有叶子节点 - 每个叶子节点生成一条新的操作记录,
op与原操作保持一致,path为原path拼接当前叶子节点的层级路径,value为当前叶子节点的值 - 针对
remove操作,如果删除的是一个对象节点,也可以按同样逻辑展开为多条针对字段的删除操作,执行效果与原操作等价
示例转换代码(Java版,适配zjsonpatch输出结构)
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; // 入参为zjsonpatch返回的原始操作列表 public List<ObjectNode> flattenPatchOps(List<ObjectNode> originalOps) { List<ObjectNode> flattenedOps = new ArrayList<>(); for (ObjectNode op : originalOps) { String opType = op.get("op").asText(); String basePath = op.get("path").asText(); JsonNode value = op.get("value"); // 只展开add/replace的对象类型value,可根据需求调整是否展开数组 if (("add".equals(opType) || "replace".equals(opType)) && value.isObject()) { flattenValue(opType, basePath, value, flattenedOps); } else { flattenedOps.add(op.deepCopy()); } } return flattenedOps; } // 递归展开对象value private void flattenValue(String op, String basePath, JsonNode currentNode, List<ObjectNode> result) { Iterator<Map.Entry<String, JsonNode>> fields = currentNode.fields(); while (fields.hasNext()) { Map.Entry<String, JsonNode> entry = fields.next(); String currentPath = basePath + "/" + entry.getKey(); JsonNode childNode = entry.getValue(); if (childNode.isObject()) { // 嵌套对象继续递归 flattenValue(op, currentPath, childNode, result); } else { // 叶子节点生成新操作 ObjectNode newOp = JsonNodeFactory.instance.objectNode(); newOp.put("op", op); newOp.put("path", currentPath); newOp.set("value", childNode); result.add(newOp); } } }
注意事项
- 如果你的场景需要将数组类型的
value也按索引展开,只需要在判断逻辑中追加value.isArray()的分支,按索引拼接路径即可 - 扁平化后的操作列表与原操作列表执行效果完全等价,不会影响最终JSON Patch的应用结果
- 若你使用其他语言版本的zjsonpatch,核心逻辑与上述实现一致,仅语法适配即可
内容的提问来源于stack exchange,提问作者Vivek Narayanasetty
相关产品推荐
相关产品推荐

