read@unnonounoさんが紹介してくださったpficommonのjsonライブラリを試してみました。pficommonのjsonライブラリはboostみたいにjsonと自分で作ったクラスのオブジェクトとのシリアライズ/デシリアライズができるのがとても魅力です。その一方で、結構ドキュメントには書いてないことが色々あったので、メモしておきます。いつものようにコードはgithubにあります。https://github.com/chezou/pficommon_json_test今回のポイントは以下の通りです。基本的なアクセスの仕方stringとjsonの相互変換オブジェクトとのシリアライズ/デシリアライズ1.wafの使い方wafはmakeの代わりのビルドシステムで、pythonでビルドします。詳細な使い方はこちらを参考にしてください。基本的には、wscriptと呼ばれるMakefileのような物をソースコードがあるディレクトリにそれぞれ書きます。この際、各ディレクトリに置かれたwscriptが再帰的に呼ばれるので、モジュール毎にディレクトリを切り分けている場合は、そのモジュールの必要なライブラリなどを書いておくべきです。例としてsrcディレクトリにあるwscriptをのせます。)見れば分かると思いますが、sourceにソースとなるファイル、targetにビルドした後の実行ファイル名、includesにヘッダーファイルの場所を書きます。libにはライブラリ名を列挙します。このとき、複数の場合はスペースで区切ればOKです。できたらこんな感じでビルドします。良くあるmapみたいなアクセスをしていって最後にjson_castをします。基本的にはstringstreamを経由します。実際にはこんな感じでします。}こんな感じで使います。util::json\_to\_string(js);4.オブジェクトとのシリアライズ/デシリアライズドキュメントにもありますが、自分で作ったクラスのjsonへのシリアライズをしたい場合は、シリアライズしたい変数をMEMBERマクロで登録しておきます。boostのような感じですね。};シリアライズしたいときは、to_jsonを、デシリアライズをしたい時はvia_json_with_defaultを使うと良いでしょう(json_castでやると不足したkeyがあるとbad_castになってしまうので)。endl;いくつか注意点・ポイントです。この辺、知っておくと無駄にハマらないかと思います。基本的な型はpfi::data::optionalを使う。使わないとnullをシリアライズできない。シリアライズしたい型はpfi::data::optional<t>を使う。datetime="2014-11-22T22:03:25+09:00">デシリアライズしたい場合は使わない。ハッシュを表したい時はmapを使う。1点目ですが、サンプルコードのSouvenirクラスを見てください。};このmax_priceのようにpfi::data::optionalとすると、変数に値が入っていない場合にto_jsonでシリアライズするとnullになってくれるのですが、以下のように直接クラスの値を参照しようとすると、値の有無が0/1で取得できる形になってしまいます。[20120320追記]optionalで宣言した型を取得する場合は、ポインタのように*演算子でアクセスするようです。boost::optionalが参考になるそうです。pficommonのoptionalの件(jsonと、メンバにoptionalを持つユーザ定義型の相互変換)についてですが、optionalも(デ)シリアライズできるようになっていました。ドキュメントに書かれていなくて申し訳ないのですが、optionalはポインタのようなものです。値を取り出すときには、*(sv2.max_price)のような感じで取り出す必要があります。optionalでググるとなんとなく分かるかと思います。**jsonを入力としてデシリアライズしたい場合はpfi::data::optionalを利用しない変数を、シリアライズしてjsonに出力したい場合はpfi::data::optionalを利用した変数にしないといけません。