怎么把两个 JSON 文件合并成一个?
把两个 .json 文件一起拖进上方的虚线框,它们会各自成为一块输入,再点「合并」即可。也可以直接把内容粘贴到两块文本框里。合并按从上到下的顺序进行,所以谁放在下面,谁在冲突时说了算。
.json 文件。支持深合并(嵌套对象逐层递归)、浅合并与数组拼接,键冲突时可以选择以谁为准,并且会逐条列出哪些字段被覆盖了。全部在浏览器本地完成,不上传任何数据。也可以点击此区域选择文件,每个文件会成为下面的一块输入
浅合并只看顶层的键:两份 JSON 里同名的顶层键,后一份整个盖掉前一份,哪怕它的值是个还有二十层的对象。深合并则在两边都是对象时继续往下走,只覆盖真正冲突的那个叶子。配置文件的场景几乎总是要深合并 —— 一份默认配置加一份只写了三行的环境覆盖,用浅合并会把默认配置里同一个分组下的其它键一起抹掉,而那正是「改了一行结果整块没了」这类问题的来源。反过来,如果两份数据本来就是平级的记录,浅合并更快也更好预测。
因为按下标合并几乎总是错的。数组的下标不是身份:把 ["a","b","c"] 和 ["x"] 按位置合并会得到 ["x","b","c"],这个结果通常没人想要 —— 提供 ["x"] 的人多半是想说「这一项就是全部」。JSON Merge Patch(RFC 7386)也是这么定的:数组作为一个整体值处理,不做逐元素合并。所以本页默认「后者覆盖」,同时给出「首尾拼接」和「拼接后去重」,因为把几份列表接起来确实是另一类常见需求,只是它和配置覆盖不是同一件事,要你自己选一次。
这是合并里最容易出事的地方。{"a": null} 到底表示「把 a 设成空」还是「a 这个键别管」,JSON 本身没有规定。RFC 7386 选择把 null 当作删除指令;而大多数「深合并」库把它当成一个普通的值,照常覆盖。两种都说得通,错在默认值不明说。本页默认不让 null 覆盖已有的值,因为在配置合并里这更接近人的本意;需要用 null 显式清空时,把「允许 null 覆盖已有的值」勾上即可。
合并工具报的错常常不是合并出的问题,而是某一份输入本来就解析不了:末尾多一个逗号、用了单引号、从代码里复制过来带着注释。本页会在每一块输入下面单独标出解析结果与出错位置,先把红色的那一块修好再合并。如果输入很长、需要看清结构或定位到具体某一行,用JSON 在线格式化展开成树形结构会比在文本框里数括号快得多。
把两个 .json 文件一起拖进上方的虚线框,它们会各自成为一块输入,再点「合并」即可。也可以直接把内容粘贴到两块文本框里。合并按从上到下的顺序进行,所以谁放在下面,谁在冲突时说了算。
可以,数量不限。点「添加一块 JSON」加输入框,或者一次拖入多个文件。合并是依次两两进行的:第 1 块和第 2 块的结果再去和第 3 块合并,以此类推,等价于按顺序层层覆盖。
默认「后面的覆盖前面的」,也就是排在下面的那一块优先,这符合「默认配置 + 环境覆盖」的常见用法。也可以切换成「前面的优先保留」,此时只有前面没有出现过的键才会被补进来。无论选哪种,被覆盖掉的字段都会在结果上方逐条列出来。
选「深合并」就不会。深合并在两边都是对象时继续往下递归,只覆盖真正冲突的叶子字段,其余保持原样。选「浅合并」则只比较顶层键,同名的顶层键会被整体替换 —— 两种行为都有用,区别见上方「深合并和浅合并差在哪」。
默认覆盖,可以在「数组字段」里改成「首尾拼接」或「拼接后去重」。去重按值比较,对象和数组也能去重(内容相同即视为重复),不只是字符串和数字。要把若干份 JSON 直接接成一个大数组,用顶部的「数组拼接」模式更直接。
默认不会,本页把 null 视为「这一项不提供」而跳过。勾上「允许 null 覆盖已有的值」之后才会覆盖。这两种行为在不同的库里都存在,所以本页把它做成一个显式开关,而不是替你默认一种。
每一块输入下面会单独显示解析状态和出错位置,先看是哪一块变红。最常见的原因是末尾多了一个逗号、用了单引号、写了 // 注释,或者从代码里复制时带上了 True、None、undefined 这类 JSON 不接受的字面量。
不会。文件读取、解析、合并和输出都在浏览器本地用 JavaScript 完成,本站没有后端可以接收内容。合并线上配置、接口返回、包含密钥的环境文件都不必担心外传,断网之后本页照样能用。