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

如何对比嵌套JSON差异并将变更应用至原JSON?

刚好我之前处理过类似的大型JSON diff/patch需求,给你分享几个靠谱的解决方案,不管是Python还是JavaScript都能搞定,还能解决你提到的索引错误问题:

Python 方案

1. 用你已经在使用的jsondiff库完成patch

你说已经能用jsondiff拿到差异,其实它自带补丁应用功能,不用额外找工具。安装好库之后,直接用patch方法就能把diff套到原JSON上:

先确保库已安装:

pip install jsondiff

示例代码:

import jsondiff

# 你的原始JSON
json1 = {
  "accounting": [
    { "firstName" : "John", "lastName" : "Doe", "age" : 23 },
    { "firstName" : "Mary", "lastName" : "Smith", "age" : 32 }
  ],
  "sales": [
    { "firstName" : "Sally", "lastName" : "Green", "age" : 27 },
    { "firstName" : "Jim", "lastName" : "Galley", "age" : 41 }
  ]
}

# 修改后的目标JSON
json2 = {
  "accounting" : [
    { "firstName" : "John", "lastName" : "Doe", "age" : 23 },
    { "firstName" : "Mary", "lastName" : "Smith", "age" : 32 },
    { "firstName" : "Steve", "lastName" : "John", "age" : 30 }
  ],
  "sales": [
    { "firstName" : "Sally", "lastName" : "Green", "age" : 30 },
    { "firstName" : "Jim", "lastName" : "Galley", "age" : 41 }
  ]
}

# 生成差异对象
diff = jsondiff.diff(json1, json2)

# 方法1:返回新的补丁后的JSON,不修改原对象
patched_json = jsondiff.patch(json1, diff)
print(patched_json == json2)  # 输出 True

# 方法2:直接在原JSON上修改(适合大型JSON节省内存)
jsondiff.patch(json1, diff, in_place=True)
print(json1 == json2)  # 输出 True

2. 更规范的jsonpatch库(遵循RFC 6902标准)

如果jsondiff的patch逻辑不符合你的预期,试试jsonpatch——它生成的是标准的JSON Patch操作列表,处理嵌套和列表变更特别稳,完全适配你说的多层嵌套大型JSON。

安装库:

pip install jsonpatch

示例代码:

import jsonpatch

# 生成标准的补丁操作列表
patch = jsonpatch.JsonPatch.from_diff(json1, json2)

# 应用补丁,返回新对象
patched_json = patch.apply(json1)

# 或者原地修改原JSON
patch.apply(json1, in_place=True)

print(json1 == json2)  # 输出 True

针对你的例子,它生成的补丁会是这样的(完全避免硬编码索引):

[
  {"op": "replace", "path": "/sales/0/age", "value": 30},
  {"op": "add", "path": "/accounting/-", "value": {"firstName": "Steve", "lastName": "John", "age": 30}}
]

这里的/accounting/-表示在列表末尾添加元素,完美解决你之前JS工具遇到的索引错误问题。


JavaScript 方案

之前你用JS工具遇到索引错误,大概率是因为工具硬编码了列表索引。推荐用jsonpatch的官方JS实现,它遵循RFC 6902标准,用-表示列表末尾添加,彻底避免索引冲突。

先安装依赖:

npm install jsonpatch

示例代码:

const jsonpatch = require('jsonpatch');

// 原始JSON
const json1 = {
  "accounting": [
    { "firstName" : "John", "lastName" : "Doe", "age" : 23 },
    { "firstName" : "Mary", "lastName" : "Smith", "age" : 32 }
  ],
  "sales": [
    { "firstName" : "Sally", "lastName" : "Green", "age" : 27 },
    { "firstName" : "Jim", "lastName" : "Galley", "age" : 41 }
  ]
};

// 目标JSON
const json2 = {
  "accounting" : [
    { "firstName" : "John", "lastName" : "Doe", "age" : 23 },
    { "firstName" : "Mary", "lastName" : "Smith", "age" : 32 },
    { "firstName" : "Steve", "lastName" : "John", "age" : 30 }
  ],
  "sales": [
    { "firstName" : "Sally", "lastName" : "Green", "age" : 30 },
    { "firstName" : "Jim", "lastName" : "Galley", "age" : 41 }
  ]
};

// 生成标准补丁
const patch = jsonpatch.compare(json1, json2);

// 应用补丁到原对象
jsonpatch.apply(json1, patch);

// 验证结果
console.log(JSON.stringify(json1) === JSON.stringify(json2)); // 输出 true

为啥推荐这些工具?

  • 全自动化处理多层嵌套和列表变更,不用你手动写一行修改代码,完美适配800行的大型JSON。
  • 要么是你已经在用的库(无缝衔接),要么是行业标准实现,稳定性拉满。
  • 彻底解决你遇到的索引错误问题,不用再担心列表变更时的索引冲突。

内容的提问来源于stack exchange,提问作者A B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:01:48