岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

商品情報のJSON表現について考えた

キープリストで提供するリソースのURI

キープリストというWebアプリを作ろうとしています。気になる商品(Amazonで扱っているもの)を放り込んでおけるサービスです。

以前の日記では、URIの設計について考えました。それからも断続的に考えていて、現在は以下のようにしようと思っています。

リソースURI
トップレベルリソースhttp://keeplist.in/
商品検索結果リソースhttp://keeplist.in/amazonsearch?q={キーワード}&format={html または json}
商品リソースhttp://keeplist.in/Item:{ASIN}.{html または json}

本当はもっとたくさんのリソースが必要ですが、書き込み可能なWebサービスの設計は高難度なので、まずは読み取り専用部分のみ考えることにします。

さて、『Webを支える技術』で紹介されているROA(リソース指向アーキテクチャ)の設計手法に従えば、URI設計に続いてリソース表現の設計フェーズとなります。

どこから手を付けようか迷ったのですが、もっとも重要な商品リソースの、もっとも簡素なJSON表現から考えることにしました。

商品情報のJSON表現

microformatsには、商品情報を表現するhProductと、集計レビュー情報を表現するhReview-aggregateがあります。これらになるべく従うことにしました。

従うといっても、いずれもドラフト段階のフォーマットですし、microformats自体、JSONへの変換方法が明確に定義されていないので、どういう表現を提供するのか、結局は自分で考える必要があります。

試行錯誤してできたのが下記のJSON表現です。


迷った点

現在のドラフトでは、hReview-aggregate には item プロパティが必須なのですが、あえて無視しました。hProduct の review プロパティとして包含されているのですから、どの商品に対するレビューなのかは自明だからです。

最初は hProduct と hReview-aggregate を並列させて、Include Pattern でインクルードさせようかと思ったのですが、JSONでどう表現したらよいか分からなかったのでやめました。

hReview-aggregate に hProduct を包含させる方法も考えられますが、レビュー情報はおまけなので、コンテナにするのは無理がある気がします。Containers に関する議論が深まっていけば、このあたりの問題が解決されるのかもしれません。

表現例の改訂履歴

  • 表現例をgistに移行しました(2010-06-01)
  • hProduct から外れる商品情報(binding、creators など)を item-detail プロパティにまとめていましたが、まとめる必要がなかったので、ばらしました(2010-06-01)