一汁三菜

自分が楽しいと思うこと、マラソン、旅行、その他日々の記録をしたい。

JSON PointerとJSON PatchがLast Call

JSON PointerJSON PatchにLast Callがかかりました。これで後はIESGが承認すれば、RFCになる事になります。-00の時と比べると変更になっている所も多々あるので、かいつまんで紹介します。

JSON Pointer

JSON版XPathといった風情のJSON Pointer。"/"でオブジェクトの階層をたどり、配列の場合は添字でアクセスするというのは変わっていません。ただ、JSON Pointerが"/"をオブジェクトの階層を表す為に使ってしまっているので、そのままだとキーに"/"を含む要素にアクセスできません。これを解決する為に、JSON Pointer中に出てくる"~"は"~0"と符号化し、"/"は"~1"と符号化するというように決められました。

下のような構造のデータがあるとすると、

{
  "one" : {
    "a" : 1, 
    "b" : 2, 
    "c" : 3
  }, 
  "two" : [ 4, 5, 6 ], 
  "three" : 7
}

以下に示すJSON Pointerは次のような値を取得できることになります。

/one
{ "a" : 1, "b" : 2, "c" : 3 }
/one/a
1
/two/0
4
/three
7

JSON Patch

HTTPのメソッド "PUT" はリソース全体を置換する事を想定している為、リソースの一部を書き換えるようなメソッドとして RFC 5789にて "PATCH" メソッドが提案されました。これをJSONを扱うRESTfulなWebサービスでも便利に使おうというのが、JSON Patchの目的でした。前述のJSON Pointerでリソース中の操作したい要素を指定して、JSONを操作する命令をHTTPのPATCHメソッドで送る事によってJSONを操作します。

JSON Patchは、当初と比べるとやや記法が変わりました。以前は命令がキー、パスが値とした一対の構造で命令を表していましたが、それぞれ"op"と"path"に分けて書くようになりました。また、"copy"命令が追加になりました。

JSON Patchの表記法は、Internet-Draftに書かれている6行の例を見るだけでも一目瞭然です。"test" に馴染みが無いという人もいるかもしれませんが、これは比較です。

{ "op": "test", "path": "/a/b/c", "value": "foo" },
{ "op": "remove", "path": "/a/b/c" },
{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
{ "op": "replace", "path": "/a/b/c", "value": 42 },
{ "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
{ "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }