You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:06:03