JSON 線上合併

把兩個或多個 JSON 合併成一個:貼上進來,或者直接拖入多個 .json 檔案。支援深合併(巢狀物件逐層遞迴)、淺合併與陣列串接,鍵衝突時可以選擇以誰為準,而且會逐條列出哪些欄位被覆寫了。全部在瀏覽器本機完成,不上傳任何資料。
拖放一個或多個 .json 檔案到這裡

也可以點擊此區域選擇檔案,每個檔案會成為下面的一塊輸入

合併方式
陣列欄位
衝突時
其它
合併結果
等待合併
說明:
1. 合併按從上到下的順序進行:先把第 1 塊和第 2 塊合併,結果再和第 3 塊合併,以此類推。順序決定誰覆寫誰
2. 深合併只對「兩邊都是物件」的鍵遞迴;只要有一邊不是物件(數值、字串、陣列、null),就按上面的規則直接取其中一個,不會去猜。
3. 陣列預設是整個取代而不是按索引合併 —— 按索引合併幾乎總是錯的,見下方正文。
4.「陣列串接」模式忽略上面的物件選項:所有輸入被串成一個陣列,本身是陣列的展開一層,不是陣列的作為一個元素放進去。
5. 拖進來的檔案不會上傳,只在瀏覽器裡讀一遍文字。

關於 JSON 合併

深合併和淺合併差在哪

淺合併只看頂層的鍵:兩份 JSON 裡同名的頂層鍵,後一份整個蓋掉前一份,哪怕它的值是個還有二十層的物件。深合併則在兩邊都是物件時繼續往下走,只覆寫真正衝突的那個葉子。設定檔的場景幾乎總是要深合併 —— 一份預設設定加一份只寫了三行的環境覆寫,用淺合併會把預設設定裡同一個分組下的其它鍵一起抹掉,而那正是「改了一行結果整塊沒了」這類問題的來源。反過來,如果兩份資料本來就是平級的紀錄,淺合併更快也更好預測。

陣列為什麼預設整個取代

因為按索引合併幾乎總是錯的。陣列的索引不是身分:把 ["a","b","c"]["x"] 按位置合併會得到 ["x","b","c"],這個結果通常沒人想要 —— 提供 ["x"] 的人多半是想說「這一項就是全部」。JSON Merge Patch(RFC 7386)也是這麼定的:陣列作為一個整體值處理,不做逐元素合併。所以本頁預設「後者覆寫」,同時給出「首尾串接」和「串接後去重」,因為把幾份清單接起來確實是另一類常見需求,只是它和設定覆寫不是同一件事,要你自己選一次。

null 是「刪掉」還是「一個值」

這是合併裡最容易出事的地方。{"a": null} 到底表示「把 a 設成空」還是「a 這個鍵別管」,JSON 本身沒有規定。RFC 7386 選擇把 null 當作刪除指令;而大多數「深合併」函式庫把它當成一個普通的值,照常覆寫。兩種都說得通,錯在預設值不明說。本頁預設不讓 null 覆寫既有的值,因為在設定合併裡這更接近人的本意;需要用 null 明確清空時,把「允許 null 覆寫既有的值」勾起來即可。

合併之前先確認每一份都是合法 JSON

合併工具報的錯常常不是合併出的問題,而是某一份輸入本來就解析不了:結尾多一個逗號、用了單引號、從程式碼裡複製過來帶著註解。本頁會在每一塊輸入下面單獨標出解析結果與出錯位置,先把紅色的那一塊修好再合併。如果輸入很長、需要看清結構或定位到具體某一行,用JSON 線上格式化展開成樹狀結構會比在文字方塊裡數括號快得多。

常見問題

怎麼把兩個 JSON 檔案合併成一個?

把兩個 .json 檔案一起拖進上方的虛線框,它們會各自成為一塊輸入,再點「合併」即可。也可以直接把內容貼到兩塊文字方塊裡。合併按從上到下的順序進行,所以誰放在下面,誰在衝突時說了算。

可以一次合併多個 JSON 嗎?

可以,數量不限。點「新增一塊 JSON」加輸入框,或者一次拖入多個檔案。合併是依序兩兩進行的:第 1 塊和第 2 塊的結果再去和第 3 塊合併,以此類推,等同於按順序層層覆寫。

鍵名相同的時候保留哪一個?

預設「後面的覆寫前面的」,也就是排在下面的那一塊優先,這符合「預設設定 + 環境覆寫」的常見用法。也可以切換成「前面的優先保留」,此時只有前面沒有出現過的鍵才會被補進來。無論選哪種,被覆寫掉的欄位都會在結果上方逐條列出來。

巢狀很深的物件會被整個取代掉嗎?

選「深合併」就不會。深合併在兩邊都是物件時繼續往下遞迴,只覆寫真正衝突的葉子欄位,其餘保持原樣。選「淺合併」則只比較頂層鍵,同名的頂層鍵會被整體取代 —— 兩種行為都有用,區別見上方「深合併和淺合併差在哪」。

陣列是串接還是覆寫?

預設覆寫,可以在「陣列欄位」裡改成「首尾串接」或「串接後去重」。去重按值比較,物件和陣列也能去重(內容相同即視為重複),不只是字串和數值。要把若干份 JSON 直接接成一個大陣列,用頂部的「陣列串接」模式更直接。

值是 null 的欄位會覆寫掉原來的值嗎?

預設不會,本頁把 null 視為「這一項不提供」而跳過。勾起「允許 null 覆寫既有的值」之後才會覆寫。這兩種行為在不同的函式庫裡都存在,所以本頁把它做成一個明確的開關,而不是替你預設一種。

合併的時候提示解析失敗怎麼辦?

每一塊輸入下面會單獨顯示解析狀態和出錯位置,先看是哪一塊變紅。最常見的原因是結尾多了一個逗號、用了單引號、寫了 // 註解,或者從程式碼裡複製時帶上了 TrueNoneundefined 這類 JSON 不接受的字面值。

JSON 內容會上傳到伺服器嗎?

不會。檔案讀取、解析、合併和輸出都在瀏覽器本機用 JavaScript 完成,本站沒有後端可以接收內容。合併線上設定、介面回傳、含有金鑰的環境檔案都不必擔心外傳,斷網之後本頁照樣能用。