JSON マージ
無料オンラインで使えるJSONマージツール。複数のJSONをディープマージ・シャローマージ・配列連結・配列上書きの4戦略でひとつに結合。データ集約、設定ファイルの階層化、i18n翻訳のマージなどに最適です。
関連おすすめ
JSONマージ(JSON Merge)とは?
JSONマージ(JSON Merge)とは、2つ以上のJSONオブジェクトを一定のルールに従って1つの新しいオブジェクトに結合する操作のことです。エンジニアリングの現場では極めて頻繁に登場します。① 複数のマイクロサービスが返すJSONを1つの統一レスポンスにまとめる(BFF層での集約)。② ベース設定、環境別設定、ユーザー設定を「環境別上書き」ロジックでマージして最終設定を生成する(Node.js config、Viper、Spring Cloud Config)。③ 複数のi18n翻訳ファイルをマージ・上書き・補完して完全な辞書にする。④ 複数のモックデータ配列を結合して完全なテストデータを作成する。⑤ 複数のAPIページネーションレスポンスをマージして全件結果を得る。
マージの難しさは「結合すること」自体ではなく、「コンフリクト(衝突)をどう処理するか」にあります。一般的なコンフリクト解決戦略は4種類あります。① **ディープマージ(Deep Merge)**:ネストされたオブジェクトを再帰的にたどり、キーごとに個別マージを行い、リーフノードで衝突した場合のみ上書きします。設定の階層化に適しています。② **シャローマージ(Shallow Merge)**:トップレベルのキーのみをマージし、同名キーは全体を上書きします。もっともシンプルな動作で、`Object.assign` に類似しています。③ **配列連結(Array Concat)**:配列型の値を1つの長い配列に連結し、すべての要素の順序を保持します。APIレスポンスの集約に適しています。④ **配列上書き(Array Replace)**:配列型の値を後から入力したものでそのまま上書きします。設定の上書きに適しています。
実装レベルでは、ディープマージは通常スタック式の再帰処理を用います。まず両辺がプレーンオブジェクト(配列でもnullでもない)であることを確認し、各キーについて再帰的に処理します。型の不一致(同名キーで片方がオブジェクト、もう片方が配列など)に遭遇した場合、一般的に「後入力優先」で処理し、型変換は行いません。GeekFormatのJSONマージツールには上記4種類の戦略が組み込まれており、ページ上で切り替えるだけで利用できます。2からN個のJSONを一度に貼り付ければ、順番に自動マージされ、統一されたフォーマット結果が出力されます。マージ処理はすべてブラウザのローカルで実行され、元のデータがサーバーにアップロードされることはありません。
ユースケース
- 複数のマイクロサービスAPIレスポンスをフロントエンド用の統一JSON構造にマージ
- base/dev/prodなど多層の設定ファイルを集約し、環境別に上書きして最終設定を生成
- 複数のi18n翻訳ファイルを言語ごとにマージ・重複除去・補完して完全な辞書を作成
- 複数のモックデータ配列やページネーションAPIレスポンスを完全なデータセットに結合
- フロントエンドコンポーネントのデフォルト設定+ユーザーカスタム設定+リモートA/Bテスト設定をマージ
- データ移行時に複数のソースシステムのJSONエクスポートファイルをマージし、下流フォーマットに統一
使い方
- マージする2〜N個のJSONを左側の入力欄に順番に貼り付け(デフォルトは2つ)、「+」をクリックして入力欄を追加します。
- ツールバーのドロップダウンでマージ戦略を選択します:ディープマージ(Deep)/シャローマージ(Shallow)/配列連結(Array Concat)/配列上書き(Array Replace)。
- 「マージ」ボタンをクリックすると、右側の出力欄にマージ後のフォーマット済み結果が表示されます。入力に構文エラーがある場合は具体的な行番号とエラーメッセージが表示されます。
- 結果に問題がなければ「コピー」をクリックしてマージ結果をクリップボードにコピーするか、「ダウンロード」をクリックしてmerged.jsonファイルとして保存し、フォーマットやSchemaバリデーションなどの後続処理を行ってください。
特徴
- 4種類のマージ戦略:ディープマージ/シャローマージ/配列連結/配列上書きをワンクリックで切り替え可能。さまざまなビジネスシナリオに対応します。
- 2からN個のJSONに対応:デフォルトで2つの入力欄があり、「+」ボタンで入力欄を動的に追加してマルチソース集約に柔軟に対応可能。
- 深い再帰マージ:多階層にネストしたオブジェクトをインテリジェントに処理し、リーフノードの衝突は指定された戦略に従って処理。すべての有効なフィールドを保持します。
- 柔軟なコンフリクト解決:トップレベルの衝突は選択した戦略で実行。ネストオブジェクトの衝突は深い階層までマージ。配列の衝突はarrayConcat/arrayReplaceで区別して処理します。
- 統一フォーマットで出力:マージ結果は2スペースインデントで表示され、人によるレビューや下流ツールへの直接コピーが容易です。
- リアルタイムマージ:貼り付け後に「マージ」ボタンをクリックすると即座に結果を取得。エラー時は具体的なJSONの行番号とエラーメッセージを表示します。
- ローカル処理でプライバシー保護:解析、マージ、フォーマットはすべてブラウザのローカルで実行され、入力内容が外部サーバーに送信されることはありません。
- 下流ツールとシームレス連携:マージ結果をワンクリックでJSONフォーマッター、Schemaバリデーション、コード生成などのツールにコピーして後続処理を行えます。
コード例
lodash mergeを使ったJavaScriptでのディープマージ
javascript// npm install lodash.merge
import merge from 'lodash.merge';
const a = { user: { name: 'Alice', age: 28 }, tags: ['admin'] };
const b = { user: { email: 'a@x.com', age: 29 }, tags: ['editor'] };
// ディープマージ: ネストしたオブジェクトを再帰的にマージし、リーフノードは後入力が前の値を上書き
const deep = merge({}, a, b);
console.log(deep);
// => { user: { name: 'Alice', age: 29, email: 'a@x.com' }, tags: ['admin', 'editor'] }
// シャローマージ: トップレベルのキーを全体的に上書きし、ネストには入らない
const shallow = Object.assign({}, a, b);
console.log(shallow);
// => { user: { email: 'a@x.com', age: 29 }, tags: ['editor'] }mergedeepを使ったPythonでのディープマージ
python# pip install mergedeep
from mergedeep import merge
a = {"user": {"name": "Alice", "age": 28}, "tags": ["admin"]}
b = {"user": {"email": "a@x.com", "age": 29}, "tags": ["editor"]}
# ディープマージ
result = merge(a, b)
print(result)
# => {'user': {'name': 'Alice', 'age': 29, 'email': 'a@x.com'}, 'tags': ['admin', 'editor']}
# 注意: mergedeepはデフォルトで配列を連結し、文字列/数値は上書きします
# 配列を上書きしたい場合は strategy='override' を指定jq -sを使ったコマンドラインでの複数JSONマージ
bash# 複数のJSON配列を1つの長い配列にマージ
jq -s 'add' a.json b.json c.json
# 複数のJSONオブジェクトを再帰的にマージ (jq 1.6+)
jq -s 'reduce .[] as $item ({}; . * $item)' a.json b.json
# シャローマージ: bのトップレベルキーをaに上書き
jq -s '.[0] * .[1]' a.json b.json
# 配列をマージ後、重複を除去したidフィールドのみを保持
jq -s '[.[].items[]] | unique_by(.id)' a.json b.jsonよくある質問
JSONマージとJSONの連結(コンカチ)は同じものですか?
完全に同じではありません。「連結(コンカチ)」は通常、文字列を単純につなぎ合わせるだけで構造を持ちません。「マージ」はJSONの構造に従って複数のオブジェクトを再帰的に1つに合成し、キー名の衝突を処理します。本ツールは後者——構造化されたJSONマージを指します。
ディープマージとシャローマージはどう使い分ければよいですか?
シャローマージはトップレベルのキーのみを処理し、同名キーは全体を置き換えます。`Object.assign` に類似した最もシンプルで直接的な動作です。ディープマージはネストされたオブジェクトを再帰的にたどり、リーフノードごとに個別マージするため、よりインテリジェントです。複数のJSONがそれぞれ異なるサブパスにフィールドを追加している場合(例: base.user.nameとoverride.user.email)はディープマージを、サブオブジェクト全体を一括で置き換えたい場合はシャローマージを使用してください。
配列のマージは順序ですか、それともインデックスですか?
本ツールはデフォルトで「連結」セマンティクスに従います。複数の配列を1つの長い配列に連結し、すべての要素の順序を保持します。2つの配列の長さが同じで、インデックスごとに上書きしたい場合は「arrayReplace」に切り替え、配列をオブジェクト構造で包んで手動でマージしてください。
キー名が衝突したとき、どちらがどちらを上書きするかはどう決まりますか?
入力順で決まります。後ろのJSONが前の同名キーを上書きします(シャロー/配列上書き戦略では全体を上書き、ディープマージではリーフノードのみ上書き)。「先入力を優先したい」場合は入力順序を入れ替えてください。
JSON配列のマージには対応していますか?
対応しています。代表的なシナリオは2つあります。① 複数のJSONがすべて配列の場合→「arrayConcat」で1つの長い配列に連結。② 複数のJSONがすべてオブジェクトで、その中のあるフィールドが配列の場合→「arrayConcat」で複数配列を連結するか、「arrayReplace」で後入力を優先して上書きします。
一度に2個を超えるJSONをマージできますか?
できます。デフォルトで2つの入力欄があり、「+」ボタンをクリックすると入力欄を動的に追加できます。すべての入力は上から下へ順番にマージされます。理論上の数制限はありませんが、ブラウザのメモリによって1セグメントあたりのサイズに制限があります。
マージ後のキーの順序はどのように決まりますか?
ディープマージの場合:最初のJSONのキー順序を優先し、2番目以降のJSONの新しいキーは該当階層の末尾に追加されます。シャローマージの場合:入力順に従い、最初のJSONのすべてのキーが先に出現し、後続のJSONの新しいキーがトップレベルに追加されます。同名キーは最初の出現順序を保持します。
ツールがフィールドの型を変更することはありますか?
型を能動的に変更することはありません。シャロー/配列上書き戦略で2つのJSONの同名キーの片方がオブジェクトでもう片方が配列の場合、「後入力優先」でそのまま上書きし、型変換は行いません。ディープマージは「両辺がプレーンオブジェクト」の場合のみ再帰し、それ以外はすべて上書き処理となります。
null値は保持されますか?
保持されます。nullはJSONで有効な値であり、本ツールはnullを通常のリーフ値として扱います。シャロー/配列上書きでは後入力のnullが前の値を上書きします。ディープマージでもnullに遭遇した場合は上書きルールに従い、特別にスキップされることはありません。
マージ後に統計情報は出力されますか?
はい。結果エリアにマージに参加したJSONのセグメント数と総キー数が表示され、結果をすばやく確認できます。詳細なフィールドリストは右側のフォーマット済み出力で直接確認してください。
ツールが私のJSONをサーバーにアップロードすることはありますか?
いいえ。解析、マージ、フォーマットはすべてブラウザのローカルで完了し、入力内容や中間結果がいかなるサーバーにも送信されることはありません。オフラインでも使用可能で、本番環境の設定や内部APIレスポンスなどの機密情報を含むマルチソースJSONの処理にも適しています。
JSONフォーマッターやSchemaバリデーションと組み合わせて使う場合の最適な順序は?
推奨ワークフロー:① JSON修復(不正なJSONをクレンジング)→ ② 本ツールでJSONマージ(マルチソース結合)→ ③ JSONフォーマット(インデント統一)→ ④ JSON Schemaバリデーション(最終構造を検証)→ ⑤ コード生成(TypeScript/Java/Goなど)。必要なステップのみ選んで使用してください。
トラブルシューティング
マージで "Unexpected token" または "Invalid JSON" エラーが表示される
原因:少なくとも1つの入力欄のJSONが不正です。解決方法:まずエラーのあるJSONを「JSON修復」ツールに貼り付けてクレンジングし(末尾のカンマ、単一引用符、引用符のないキーなどを自動処理)、その後本ツールに戻ってマージしてください。または、外側の中括弧/角括弧が閉じているか確認してください。
マージ後に一部のフィールドが表示されない
原因:シャロー/配列上書き戦略では、同名キーが後入力の内容で全体的に上書きされます。ディープマージでは、null値のフィールドが前のオブジェクトを上書きすることもあります。解決方法:戦略を「ディープマージ」に切り替えて階層ごとに確認してください。後入力のnullによる上書きが原因の場合は、後入力のJSONからnullフィールドを削除するかプレースホルダー値に置き換えてください。
配列が連結されずに上書きされる
原因:現在の戦略が「シャローマージ」または「配列上書き」になっています。解決方法:ツールバーのドロップダウンで「配列連結(Array Concat)」に切り替えてください。または、2つの配列を手動で1つに結合してからマージしてください。
ディープマージの結果でオブジェクトが配列になる、またはその逆が発生する
原因:2つのJSONの同じパスで「オブジェクト vs 配列」の型の不一致があり、ディープマージは型の不一致に遭遇すると「後入力優先」で処理します。解決方法:両辺の型を統一する(両方ともオブジェクトにするか両方とも配列にする)か、シャロー/配列上書き戦略に切り替えてセマンティクスを明確にしてください。
マージ後にキーの順序が崩れる
原因:2番目のJSONの新しいキーは「挿入位置」で最初のJSONの後ろに追加されます。また、ブラウザ/パーサーは純粋な整数キーを自動的に数値順にソートします。解決方法:すべての入力JSONを「JSONソート」ツールでキー名順に統一してからマージするか、結果を使用する前に再度ソートしてください。
大きなファイル(10MB以上)のマージでフリーズする
原因:ブラウザが一度に複数の大きなテキストをJSON.parseすると大量のメモリを消費します。解決方法:各入力を1〜2MB以内に抑えてください。超大ファイルはローカルでNode.js(lodash.merge)またはPython(mergedeep)スクリプトを使って処理し、処理後に本ツールで簡易検証することをお勧めします。
用語集
- JSON Merge
- 2つ以上のJSONオブジェクトを指定されたルールに従って1つの新しいオブジェクトに結合する操作。核心的な難しさは「キー名が衝突したときの解決戦略」にあります。
- Deep Merge / ディープマージ
- ネストされたオブジェクトを再帰的にたどり、リーフノードごとに個別マージする戦略。両辺がプレーンオブジェクトの場合は再帰し、それ以外は上書き処理となります。
- Shallow Merge / シャローマージ
- トップレベルのキーのみをマージし、同名キーは全体を上書きする戦略。JavaScriptでは `Object.assign({}, a, b)` と同等の動作です。
- Array Concat / 配列連結
- 配列のマージ戦略の1つ。複数の配列を1つの長い配列に連結し、すべての要素の順序を保持します。主にAPIレスポンスの集約に使用されます。
- Array Replace / 配列上書き
- 配列のマージ戦略の1つ。同名の配列を後入力の内容で全体的に上書きします。主に設定の上書きに使用されます。
- Object.assign
- JavaScriptの組み込みメソッドで、1つ以上のソースオブジェクトから列挙可能な自身のプロパティをターゲットオブジェクトに浅くコピーします。シャローマージの事実上の標準実装です。
- lodash.merge
- Lodashライブラリが提供するディープマージ関数で、Node.jsエコシステムで最も広く使われているDeep Mergeの実装。配列は上書きではなく連結されます。
- mergedeep (Python)
- Pythonエコシステムのディープマージライブラリ。pip install mergedeepでインストール可能。strategyパラメータで配列の連結/上書き動作を制御できます。
- jq -s 'add'
- jqコマンドで複数のJSON配列を単一の配列に加算する方法。複数のJSONオブジェクトをマージする場合は `reduce .[] as $item ({}; . * $item)` を使用します。
- BFF (Backend for Frontend)
- マイクロサービスアーキテクチャにおいてフロントエンドとバックエンドサービスの間に位置する集約レイヤー。複数のサービスのJSONレスポンスを統一レスポンスにマージする必要があり、JSONマージの代表的なユースケースです。
JSONマージ戦略4種類の比較
| 戦略 | 適用範囲 | 配列の処理 | 代表的なユースケース |
|---|---|---|---|
| ディープマージ (Deep) | すべてのネスト階層を再帰処理 | 選択したarrayConcat/arrayReplaceに従う | 複数環境の設定階層化、i18n辞書のマージ |
| シャローマージ (Shallow) | トップレベルのみマージ | 全体を上書き | Object.assignスタイルのシンプルな上書き |
| 配列連結 (Array Concat) | トップレベル | 新しい配列に連結 | ページネーションAPIの集約、モックデータの結合 |
| 配列上書き (Array Replace) | トップレベル | 後入力を優先 | Feature Flag設定の上書き |
主なJSONマージ実装の対照表
| 実装/ライブラリ | 言語 | デフォルト動作 | 備考 |
|---|---|---|---|
| Object.assign | JavaScript | シャローマージ | ES2015標準ライブラリ。ES2017以降は `Object.assign({}, a, b)` で利用可能 |
| { ...a, ...b } | JavaScript | シャローマージ | スプレッド構文。より簡潔な記述が可能 |
| lodash.merge | JavaScript | ディープマージ | 配列は連結(上書きしない)。npm install lodash.merge |
| mergedeep | Python | ディープマージ | strategy='override' で配列を上書きに変更可能 |
| deepmerge (Python) | Python | ディープマージ | 別の人気実装。pip install deepmerge |
| jq -s 'add' | Shell | 配列の加算 | オブジェクトのマージには `reduce .[] as $i ({}; . * $i)` が必要 |
Authoritative References
- JSON 圧縮
- CSV to JSON
- JSON から CSV
- JSON Diff
- JSON Escape / Unescape
- JSONフラット化
- JSON フォーマッター
- JSON 生成
- JSONPath オンラインクエリ
- JSON マージ
- JSON 修復
- JSON Schema バリデーター
- JSONソート
- JSON Stringify
- JSONをHTMLに変換
- JSONからJavaへ
- JSON から Markdown
- JSON を SQL に変換
- JSON から TOML へ変換
- JSONをTypeScriptに変換
- XML を JSON に変換
- JSONをXMLへ変換
- YAML を JSON に変換
- JSON → YAML 変換
- JSON から Go へ
- JSON から Rust
- JSON から Swift
- JSON から C#
- JSON から C++
- JSON を PHP に
- JSON から Python