JSON Patch ジェネレーター
2つのJSON文書を比べ、前者を後者に変えるRFC 6902のパッチを得られます。すべてブラウザー内で動作します。
このツールがすること
2つのJSON文書を比べ、前者を後者に変える操作の一覧を、RFC 6902が定める形式で書き出します。1つの項目が変わったと伝えるために文書全体を送るのではなく、変更そのものを送ります。
使いどころ
PATCHリクエストの本文を組み立てるとき、設定ファイルの2つの版のあいだで何が変わったかを記録するとき、完全なコピーを全部残すよりずっと小さい監査履歴を保存するときに使えます。同じに見える2つの文書が実際にはどこで違うのかを手早く知る方法でもあります。
生成される操作
| 操作 | 意味 |
|---|---|
| add | 値がなかった場所に値を追加するか、配列に挿入します。 |
| remove | その場所の値を削除します。 |
| replace | すでに存在する場所の値を上書きします。 |
| move | 値をある場所から別の場所へ移します。 |
| copy | 値を別の場所へ複製します。 |
| test | 値を確認し、一致しなければパッチ全体を中止します。 |
このツールが書き出すのは add、remove、replace だけです。この3つでどんな変更も表せますし、一行ずつ読めるパッチは、短くても読み解くのに骨が折れるパッチより価値があります。残りの3つもRFC 6902の一部で、準拠したサーバーなら受け付けます。
パスの仕組み
各パスはJSON Pointer(RFC 6901)です。文書のルートからスラッシュで区切った道筋で、「/address/zipCode」は address の中の zipCode を指します。配列の位置は数字なので「/skills/0」は最初の要素、ハイフンは配列の末尾を意味し「/skills/-」は末尾への追加です。スラッシュが区切り文字なので、スラッシュを含むキーは ~1 と書き、そのままのチルダは ~0 と書きます。
出力についての注意
比較は字義どおりで、値を位置ごとに突き合わせます。そのため配列の先頭に要素を挿入すると、1回の挿入ではなく以降すべての要素に replace が出ます。安定した識別子を持つオブジェクトの配列なら、識別子から作ったパッチのほうが位置から作ったものより必ず小さくなります。
JSON Patchの作り方
2つのJSON文書を貼り付けてパッチを生成します。
- 左側に元のJSONを貼り付けます。
- 右側に変更後のJSONを貼り付けます。
- 「生成」を押し、パッチをコピーします。
よくある質問
このツールはデータをどこかに送信しますか?
いいえ。どちらの文書もブラウザー内にとどまり、パッチはお使いの端末で生成されます。
出力はRFC 6902に準拠していますか?
はい。どの操作も op と path、そして add と replace では value を持つオブジェクトで、パスはRFC 6901が定めるJSON Pointerです。
move や copy の操作も含まれますか?
いいえ。add、remove、replace だけを書き出します。どんな変更も表せて、読むのがはるかに簡単だからです。move は remove のあとに add を続けたものにすぎません。
パッチはどう適用しますか?
application/json-patch+json を受け付けるAPIに送るか、ライブラリを使ってください。Pythonなら jsonpatch、JavaScriptなら json-patch、.NETなら JsonPatchDocument、Javaなら json-patch といった具合です。
JSON Merge Patch との違いは?
JSON Merge Patch(RFC 7386)は文書そのものに似た形で、null が「削除」を意味します。読みやすい反面、本物の null を保存できず、配列の要素をひとつだけ変えることもできません。JSON Patch は冗長ですが、何でも表現できます。
Wikipedia — JSON Patch
Wikipedia — JSON
Wikipedia — Patch (computing)
Wikipedia — Diff
Wikipedia — REST