JSON をオンラインで結合

2 つ以上の JSON を 1 つに結合します。貼り付けるか、複数の .json ファイルをそのままドロップしてください。ディープマージ(ネストしたオブジェクトを 1 階層ずつ再帰)、シャローマージ、配列の連結に対応し、キーが競合したときにどちらを優先するかを選べます。さらにどのフィールドが上書きされたかを 1 件ずつ一覧表示します。すべてブラウザー内で完結し、データは一切送信しません。
1 つまたは複数の .json ファイルをここにドロップ

この領域をクリックしてファイルを選ぶこともできます。ファイル 1 つが下の入力ブロック 1 つになります

結合方法
配列フィールド
競合時
その他
結合結果
結合待ち
説明:
1. 結合は上から下の順に進みます。まず 1 番目と 2 番目のブロックを結合し、その結果をさらに 3 番目と結合する、という具合です。順序が上書きの優先順位を決めます
2. ディープマージが再帰するのは「両側ともオブジェクト」のキーだけです。片方でもオブジェクトでなければ(数値・文字列・配列・null)、上のルールに従ってどちらか一方をそのまま採用し、推測はしません。
3. 配列は既定でまるごと置き換えであり、添字ごとの結合はしません —— 添字による結合はほぼ確実に誤りだからです。詳しくは下の本文をご覧ください。
4.「配列連結」モードは上のオブジェクト向けオプションを無視します。すべての入力が 1 つの配列に連結され、それ自体が配列のものは 1 階層展開され、配列でないものは要素 1 つとして入ります。
5. ドロップしたファイルはアップロードされません。ブラウザー内でテキストとして読み取るだけです。

JSON の結合について

ディープマージとシャローマージの違い

シャローマージが見るのはトップレベルのキーだけです。2 つの JSON に同名のトップレベルキーがあれば、たとえその値が 20 階層あるオブジェクトでも、後ろの方がまるごと前を上書きします。ディープマージは両側がオブジェクトである限り下へ降り続け、本当に競合している葉だけを上書きします。設定ファイルの場面ではほぼ常にディープマージが必要です。既定の設定に 3 行だけ書いた環境用の上書きを重ねる場合、シャローマージだと既定の設定の同じグループにある他のキーまで消えてしまい、これがまさに「1 行変えたらブロックごと消えた」という問題の出どころです。逆に、2 つのデータがもともと対等なレコードなら、シャローマージの方が速く予測もしやすくなります。

配列が既定でまるごと置き換えられる理由

添字による結合がほぼ確実に誤りだからです。配列の添字は identity ではありません。 ["a","b","c"]["x"] を位置で結合すると ["x","b","c"]になりますが、これを望む人はまずいません —— ["x"] を渡した人は「この 1 項目がすべてだ」と言いたいのがほとんどでしょう。JSON Merge Patch(RFC 7386)もそう定めています:配列は 1 つの値全体として扱い、要素ごとの結合はしません。そのため本ページの既定は「後ろで上書き」で、同時に「前後を連結」と「連結後に重複除去」も用意しています。いくつかのリストをつなげたいというのも確かによくある要望ですが、それは設定の上書きとは別の作業なので、一度ご自身で選んでいただく形にしています。

null は「削除」なのか「1 つの値」なのか

ここが結合でいちばん事故が起きやすいところです。{"a": null} が「a を空にする」なのか「a というキーには触らない」なのかは、JSON 自体が定めていません。RFC 7386 は null を削除命令とみなす立場をとりますが、多くの「ディープマージ」ライブラリーはこれを普通の値として扱い、通常どおり上書きします。どちらも筋は通っていて、悪いのは既定の挙動を明示しないことです。本ページの既定はnull に既存の値を上書きさせないです。設定の結合では、その方が人の意図に近いからです。null で明示的に空にしたいときは「null による既存値の上書きを許可」にチェックを入れてください。

結合の前に、どれも正しい JSON かを確認する

結合ツールが出すエラーは、結合そのものの問題ではなく、どれか 1 つの入力がそもそも解析できないだけ、ということがよくあります。末尾のカンマ、シングルクォート、コードからコピーしたときに付いてきたコメントなどです。本ページは入力ブロックごとに解析結果とエラー位置を個別に表示するので、赤くなったブロックを直してから結合してください。入力が長く、構造を把握したり特定の行を探したりしたい場合は、JSON オンライン整形で開いてツリー表示に展開する方が、テキストエリアで括弧を数えるよりずっと速く済みます。

よくある質問

2 つの JSON ファイルを 1 つに結合するには?

2 つの .json ファイルを一緒に上の破線の枠へドロップすると、それぞれが 1 つの入力ブロックになります。あとは「結合」を押すだけです。内容を 2 つのテキストエリアに直接貼り付けても構いません。結合は上から下の順に進むので、下に置いたブロックが競合時に優先されます。

一度に複数の JSON を結合できますか?

できます。数に制限はありません。「JSON ブロックを追加」で入力欄を増やすか、複数のファイルを一度にドロップしてください。結合は順に 2 つずつ行われます。1 番目と 2 番目の結果をさらに 3 番目と結合する、という具合で、順に重ねて上書きしていくのと同じです。

キー名が同じときはどちらが残りますか?

既定は「後ろが前を上書き」で、下に並んだブロックが優先されます。これは「既定の設定 + 環境ごとの上書き」というよくある使い方に合っています。「前を優先して残す」に切り替えることもでき、その場合は前に出てこなかったキーだけが補われます。どちらを選んでも、上書きされたフィールドは結果の上に 1 件ずつ一覧表示されます。

深くネストしたオブジェクトはまるごと置き換えられますか?

「ディープマージ」を選べばそうはなりません。ディープマージは両側がオブジェクトである限り下へ再帰し、本当に競合している葉のフィールドだけを上書きして、残りはそのままにします。「シャローマージ」ではトップレベルのキーだけを比較するので、同名のトップレベルキーはまるごと置き換わります —— どちらの挙動にも用途があり、違いは上の「ディープマージとシャローマージの違い」をご覧ください。

配列は連結ですか、上書きですか?

既定は上書きで、「配列フィールド」から「前後を連結」または「連結後に重複除去」に変更できます。重複除去は値で比較するため、文字列や数値だけでなくオブジェクトや配列も対象になります(内容が同じなら重複とみなします)。複数の JSON をそのまま 1 つの大きな配列につなげたい場合は、上部の「配列連結」モードの方が直接的です。

値が null のフィールドは元の値を上書きしますか?

既定では上書きしません。本ページは null を「この項目は指定しない」とみなして飛ばします。「null による既存値の上書きを許可」にチェックを入れてはじめて上書きされます。この 2 つの挙動はライブラリーによって分かれるため、本ページでは既定を勝手に決めず、明示的なスイッチにしています。

結合時に解析エラーと出たらどうすればよいですか?

入力ブロックごとに解析状態とエラー位置が個別に表示されるので、まずどのブロックが赤くなったかを確認してください。よくある原因は、末尾のカンマ、シングルクォート、 // コメント、あるいはコードからコピーしたときに付いてきた TrueNoneundefined といった JSON が受け付けないリテラルです。

JSON の内容はサーバーに送信されますか?

いいえ。ファイルの読み取り、解析、結合、出力はすべてブラウザー内の JavaScript で行われ、本サイトには内容を受け取るバックエンドがありません。本番の設定、API のレスポンス、秘密鍵を含む環境ファイルを結合しても外部に出る心配はなく、ネットワークを切っていても本ページは動作します。