JSON 对比:比较 JSON 对象

粘贴两个 JSON 文档,准确查看哪里发生了变化。每处差异都按路径列出(如 $.users[2].email),格式或键顺序的不同永远不会造成误报。

在浏览器中运行无需注册不上传任何数据

键顺序始终会被忽略。

如何使用JSON 对比

  1. 在左侧粘贴原始 JSON,在右侧粘贴修改后的 JSON,或者打开两个文件。
  2. 语法错误会显示在各个输入框下方,并注明行和列,方便你快速修复。
  3. 查看变更路径表格:每一行都显示某个值是新增、删除还是修改,并附有旧值和新值。
  4. 当列表表示集合时(例如标签或权限),勾选忽略数组顺序。
  5. 滚动到并排视图,在上下文中查看变更,或将变更列表复制为 JSON。

为什么结构化 JSON 对比优于文本对比

普通的文本对比按字符和行进行比较,因此两个包含相同数据的 JSON 文件,如果一个被压缩、缩进方式不同或键的顺序不同,看起来就会完全不一样。本工具先解析两个文档,再比较数据:对象按键逐一比较,与顺序无关;数字、字符串、布尔值和 null 按值比较。只有真正的变更才会被报告。

变更是如何报告的

每处差异都有一个 JSONPath 风格的位置,例如 $.owner.email 或 $.items[3].price,以及以下三种类型之一:

  • 新增:该键或数组元素只存在于修改后的 JSON 中。
  • 删除:它只存在于原始 JSON 中。
  • 修改:两边都存在但值不同,包括类型变化,例如字符串变成了数字。

数组使用最长公共子序列算法对齐,因此在列表开头插入一个元素只会被报告为一次新增,而不会把后面的每个元素都标记为已修改。

忽略数组顺序

许多 API 返回的列表顺序没有意义,例如角色、标签或 ID。开启忽略数组顺序后,数组会被当作集合比较:只有当某个元素在另一侧找不到相等的对应项时,才算作新增或删除。并排视图也会对数组元素排序,让相等的列表对齐。

典型用途

比较预发布环境和生产环境的 API 响应,检查一次迁移改动了配置文件中的哪些内容,审查两个 package.json 或 tsconfig 文件之间的差异,以及调试快照测试。

常见问题

比较 JSON 时键的顺序重要吗?
不重要。JSON 对象是无序的,因此 {"a":1,"b":2} 和 {"b":2,"a":1} 会被视为相等。数组顺序默认是重要的,因为数组是有序的,但你可以通过忽略数组顺序关闭这一点。
我的 JSON 会被上传到服务器吗?
不会。两个文档都在你的浏览器中解析和比较,不会通过网络发送任何内容,因此可以放心用于包含令牌或客户数据的 API 响应。
$.users[2].email 这样的路径是什么意思?
$ 表示文档的根,.users 是一个键,[2] 是数组的第三个元素(索引从 0 开始)。包含空格或特殊字符的键会写在方括号中,例如 $["first name"]。
1 和 1.0 相等吗?
相等。两者解析后是同一个数字,所以不会被报告为差异。而数字和字符串(例如 1 和 "1")是不同的,会被报告为修改。
可以比较带注释或尾随逗号的 JSON 吗?
标准 JSON 不允许它们,因此这类输入会被标记出确切的行和列。请删除注释或逗号,或先在 JSON 格式化工具中整理文档。

相关工具