JSON標準ガイド:RFC 6901、6902、7396
JSONはWebにおけるデータ交換の事実上の標準となりました。しかし、APIが複雑になるにつれて、単純なJSONオブジェクトだけでは不十分なことが多くあります。開発者は、JSONドキュメントの特定の部分を参照したり、ドキュメントへの変更を記述したりするための標準化された方法を必要としています。そこで登場するのが、RFC 6901 (JSON Pointer)、RFC 6902 (JSON Patch)、および RFC 7396 (JSON Merge Patch) です。
JSON PointerとPatchとは?
- RFC 6901 (JSON Pointer): JSONドキュメント内の特定の値を識別するための文字列構文を定義します。データの一種の「アドレス」です。
- RFC 6902 (JSON Patch): JSONドキュメントに適用される一連の操作を表現するためのJSONドキュメント構造を定義します。「差分」や「トランザクションログ」のようなものです。
- RFC 7396 (JSON Merge Patch): 変更されたフィールドのみを含む、ターゲットドキュメントに似た「パッチ」ドキュメントを送信することで、変更を記述するよりシンプルな方法を提供します。
1. RFC 6901: JSON Pointer
JSON Pointerは、スラッシュ (/) で区切られた構文を使用して、JSONオブジェクトの階層をナビゲートします。
構文ルール:
/はルートを表します。/fooは "foo" キーの値を指します。/foo/0は "foo" 配列の最初の要素を指します。~1はリテラルの/を表すために使用されます。~0はリテラルの~を表すために使用されます。
例:
{
"biscuits": [
{ "name": "Digestive" },
{ "name": "Choco" }
]
}
ポインタ /biscuits/1/name は "Choco" に解決されます。
2. RFC 6902: JSON Patch
JSON Patchは操作オブジェクトの配列です。各オブジェクトには op フィールドが必要です。
操作:
- add: 指定されたパスに値を追加します。
- remove: パスの値を削除します。
- replace: パスの値を置換します。
- move: 値をあるパスから別のパスに移動します。
- copy: 値をあるパスから別のパスにコピーします。
- test: パスの値が期待通りであることをテストします。
パッチの例:
[
{ "op": "replace", "path": "/biscuits/0/name", "value": "Oatmeal" },
{ "op": "add", "path": "/biscuits/-", "value": { "name": "Ginger" } }
]
/biscuits/- の - は「配列の末尾」を意味します。
3. RFC 7396: JSON Merge Patch
JSON Merge PatchはRFC 6902よりもはるかにシンプルです。変更したいフィールドの最終状態を表すJSONオブジェクトを送信するだけです。
ルール:
- パッチにnull以外の値を持つフィールドが含まれている場合、そのフィールドは更新または追加されます。
- パッチに
null値を持つフィールドが含まれている場合、そのフィールドはターゲットから削除されます。 - 配列のパッチには適していません(配列全体を置き換えます)。
例:
ターゲット:
{ "a": "b", "c": "d" }
パッチ:
{ "a": "z", "c": null, "e": "f" }
結果:
{ "a": "z", "e": "f" }
比較: Patch vs. Merge Patch
| 機能 | RFC 6902 (Patch) | RFC 7396 (Merge Patch) |
|---|---|---|
| 複雑さ | 高い(操作の配列) | 低い(オブジェクトベース) |
| 効率 | 非常に高い(外科的) | 中程度(フィールドレベル) |
| 配列サポート | 完全サポート | 不十分(配列全体を置換) |
| 原子操作 | あり(test操作) | なし |
| 最適な用途 | 複雑な状態変更 | シンプルなプロパティ更新 |
よくある質問 FAQ
Q: APIにはどちらを使うべきですか? A: 正確な配列操作を気にしない単純なリソース更新には JSON Merge Patch (7396) を使用してください。複雑なリソース、高いパフォーマンス要件、またはアトミックな「テストと設定」操作が必要な場合は JSON Patch (6902) を使用してください。
Q: URLでJSON Pointerを使えますか?
A: はい、URIフラグメントでJSON Pointerを使用することは一般的です(例: example.com/schema.json#/definitions/user)。
Q: キー内の特殊文字はどう扱いますか?
A: / には ~1、~ には ~0 を使用します。例えば、a/b という名前のキーは /a~1b として参照されます。
関連ツール
- JSON フォーマッタ&バリデータ - PatchまたはMerge Patchドキュメントの検証に使用します。
- JSON CSV 変換 - 分析のためにJSONデータをフラット化します。