怎麼把兩個 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 完成,本站沒有後端可以接收內容。合併線上設定、介面回傳、含有金鑰的環境檔案都不必擔心外傳,斷網之後本頁照樣能用。