2014年7月2日水曜日

JSON のオブジェクトを ID でリンクする

複数のプロパティに同じ値のオブジェクトを設定するのは面倒だし同じであることがわかりにくい。


{"prop1":{"value":12345},


 "prop2":{"value":12345},


 "prop3":{"value":12345}}


 


いちいち同じ値のオブジェクトを記述しないで、共通のオブジェクトを参照したくなりました。


あれ={"value":12345}


{"prop1":あれ, "prop2":あれ, "prop3":あれ}


 


 そこで、 ID というプロパティを持たせて、オブジェクトを ID で表せないか考えました。


共通のオブジェクトを指定したい場合は、そのプロパティにオブジェクトの ID を指定します。


{"id":"hoge", "value":12345}


{"prop1":"hoge", "prop2":"hoge", "prop3":"hoge"}


 


ID といってもただの文字列なので、読み込み側でオブジェクトが指定されるはずのプロパティで文字列があったら、その文字列を ID とするオブジェクトを割り当てる処理が必要です。


 「オブジェクトが指定されるはずのプロパティ」かどうかを判別する手段として、あらかじめ読み込み側に教えておくか、プロパティ名にプレフィックスなどをつけて表すことが考えられます。


さらに何かないかと調べていると、JSON のハイパースキーマ仕様には参照型というものがある事を知りました。


JSONだってハイパーメディア -- JSONハイパースキーマ仕様をなんとかしたい - 檜山正幸のキマイラ飼育記


URL をただの文字列ではなく "$ref" というプロパティの値として指定することで、その文字列が参照であることを表します。


 


これを先ほどの例に適用すると、さきほどよりも参照であることが明確にわかるようになりました。


{"id":"hoge", "value":12345}


{"prop1":{"$ref":"hoge"}, "prop2":{"$ref":"hoge"}, "prop3":{"$ref":"hoge"}}


 


$ref をいちいち打つのが面倒とか思ってしまいそうですが、今後も特別な意味を持つ文字列を扱いたい場合などにこの方法は有効だと思いました。


直接の関係はありませんが、ECMA script 5 の property descriptor も値をオブジェクトに包んで情報を付加しています。


 


これならば読み込み側でプロパティによって処理を変える必要はないので、扱うデータによって読み込み側を変更する必要はありません。


「$ref プロパティだけのオブジェクト」が値の場合は参照として処理すればよいだけです。


 


今日は仕様をある程度形にできました。明日は実装までいきたいです。


JavaScript 自体まだ不慣れなところがありますが、テストケースのフレームワークがあればそれを使ってみたいです。


 


0 件のコメント:

コメントを投稿