JSON 差分と JSON Patch
データ変換
読み込み中
ツールを読み込んでいます
ツールを準備しています。残り時間はまだわかりません。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
左に元の JSON、右に目標を入力します。差分表と JSON Patch を表示し、エクスポート前にパッチを実際に適用して目標と同等か検証します。
主な用途
- 設定の変更を確認し、パス別の差分レポートをコピーする。
- 既知の元 JSON 文書に対する add/remove/replace パッチを作成する。
- 二進浮動小数点の丸めを避け、大きな整数の識別子を比較する。
使い方
- 1.元データと目標のラベル付き欄に厳密な JSON 値を貼り付けます。
- 2.比較してパッチを生成を押します。キャンセルでワーカーを停止できます。
- 3.差分表と完全な検証済みパッチを確認します。長いレポートはページを切り替えます。 有効な結果のレポートやパッチをコピー、またはダウンロードします。入力の変更で結果は消去されます。
元データから目標への検証可能な例
名前の変更
元の値: {"name":"Ada"}
目標の値: {"name":"Grace"}[{"op":"replace","path":"/name","value":"Grace"}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
プロパティを追加
元の値: {}
目標の値: {"active":true}[{"op":"add","path":"/active","value":true}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
プロパティを削除
元の値: {"old":null}
目標の値: {}[{"op":"remove","path":"/old"}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
配列の末尾を逆順に削除
元の値: [1,2,3] 目標の値: [1]
[{"op":"remove","path":"/2"},{"op":"remove","path":"/1"}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
順に追加
元の値: [1] 目標の値: [1,2,3]
[{"op":"add","path":"/1","value":2},{"op":"add","path":"/2","value":3}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
スラッシュとチルダのエスケープ
元の値: {"a/b":{"~key":1}}
目標の値: {"a/b":{"~key":2}}[{"op":"replace","path":"/a~1b/~0key","value":2}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
空のキーとルートは別
元の値: {"":1}
目標の値: {"":2}[{"op":"replace","path":"/","value":2}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
ルート値を置換
元の値: null 目標の値: [true]
[{"op":"replace","path":"","value":[true]}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
大きな整数を保持
元の値: 9007199254740992 目標の値: 9007199254740993
[{"op":"replace","path":"","value":9007199254740993}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
表記が違っても数値が等しい
元の値: {"n":1.00,"z":-0}
目標の値: {"z":0,"n":1e0}[]
左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
特殊キーをデータとして扱う
元の値: {}
目標の値: {"__proto__":{"safe":true}}[{"op":"add","path":"/__proto__","value":{"safe":true}}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
Unicode 文字を保持
元の値: {"emoji":"猫"}
目標の値: {"emoji":"😀"}[{"op":"replace","path":"/emoji","value":"😀"}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
識別子ではなく添字で比較
元の値: ["a","b"] 目標の値: ["b"]
[{"op":"replace","path":"/0","value":"b"},{"op":"remove","path":"/1"}]左の JSON に完全なパッチを適用すると右と同等の値になります。操作の順序は重要です。
入力と出力の確認
- デコード後の重複キー、コメント、末尾カンマ、先頭 BOM は自動修復せず拒否します。
- 空の Pointer はルート、/ は空のオブジェクトキーです。~1 は /、~0 は ~ に戻します。
- 元データが変わったら古いパッチを適用しないでください。test による前提条件は含まれません。
- 入力編集、言語切り替え、キャンセル、画面移動で以前の結果と出力通知は無効になります。
制限と注意事項
- 各入力は UTF-8 で 200,000 バイト、コンテナー 64 階層、20,000 値まで。最大 2,000 操作、パッチとレポートの合計 500,000 バイト、実行時間 5 秒までです。
- 十進数を正確に比較し、パッチの数値表記を保持します。数値は 256 文字、指数の絶対値は 10,000 まで。重複キーと対にならない Unicode サロゲートは拒否します。
- 配列は識別子ではなく添字で比較します。生成するのは add/remove/replace のみで、最小パッチや汎用パッチ読み込み機能ではありません。オブジェクトの順序、空白、数値的に等しい表記の違いは無視します。
- 必ず同じ元の値に適用してください。前提条件を確認する test 操作は含みません。外部のパーサーでは数値精度が失われたり、特殊キーが拒否されたりするため、使用前に確認してください。
- 1 ページ 50 件、各値は UTF-16 コード単位で 400 まで表示します。コピーしたレポートには完全な値が含まれ、パッチも省略されません。表示パスは $ 記法、パッチは JSON Pointer です。
よくある質問
目標と完全に同じテキストになりますか?
同等の JSON 値を再現します。空白、オブジェクトのメンバー順、エスケープ表記、1.00 と 1e0 のような等しい数値表記は差分になりません。配列順と文字列のコードポイントは区別します。
任意の JSON Patch を読み込めますか?
いいえ。生成と内部検証は add/remove/replace のみです。パッチの読み込みや move/copy/test の生成は行わず、最小の操作数も保証しません。
特殊キーは安全に扱えますか?
__proto__、constructor、prototype は Map の通常のエントリーとして処理し、JavaScript のプロトタイプには代入しません。外部ライブラリーでは拒否される場合があるため、適用先を確認してください。
数値の精度はどう保持しますか?
長さと指数の制限内で十進数を正確に比較します。変更値は目標の数値リテラルのままパッチに保存します。ただし外部の binary64 パーサーでは丸められる場合があります。