戻る

JSON 差分と JSON Patch

データ変換

読み込み中

ツールを読み込んでいます

ツールを準備しています。残り時間はまだわかりません。

このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。

このツールについて

左に元の JSON、右に目標を入力します。差分表と JSON Patch を表示し、エクスポート前にパッチを実際に適用して目標と同等か検証します。

主な用途

  • 設定の変更を確認し、パス別の差分レポートをコピーする。
  • 既知の元 JSON 文書に対する add/remove/replace パッチを作成する。
  • 二進浮動小数点の丸めを避け、大きな整数の識別子を比較する。

使い方

  1. 1.元データと目標のラベル付き欄に厳密な JSON 値を貼り付けます。
  2. 2.比較してパッチを生成を押します。キャンセルでワーカーを停止できます。
  3. 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 パーサーでは丸められる場合があります。

関連ツール