json.hpp

一番わくわくする言語は C++ に決まってんだろうが。

さて、C++JSON ライブラリ書きました。仕事で使う用にと思ってつくったんだけど実際そんなに使わないムードになってしょんぼりしたのでちょっと手を加えて簡易化したものを公開します。

http://dishhh.jp/wk/json_hpp

↓こんな感じで使う。

// オブジェクトを JSON 文字列にする

map<string, vector<int> > o;
o["foo"].push_back(10);
o["foo"].push_back(20);
o["foo"].push_back(30);
o["bar"].push_back(100);
o["bar"].push_back(200);
o["bar"].push_back(300);
cout << json::to_json(o) << endl;
//=> {"foo": [10, 20, 30], "bar": [100, 200, 300]}
// 文字列から読み込む

string json = "{\"value\": [123, 456, 789]}";
json::JsonObject* obj = json::JsonParser::parse_string(json);
json::JsonObject* value = obj->get("value");
for (size_t i = 0; i < value->size(); ++i) {
  cout << value->at(i)->as_int() << endl;
  //=> 123, 456, 789
}
delete obj;

ポイントは、

  • ヘッダ 1 つだけで使える(ヘッダ 1 つに無理やり押し込んでるとも言う)
  • STL のコンテナを JSON 化できる
  • 標準ライブラリだけで動く
  • コンテナがどんなオブジェクトを含んでいても to_json() 関数書けば JSON 化できる(「map」の場合、「string to_json(const MyNiceClass&)」 を用意すればいい)

とかそこらへんで、

  • Unicode 無視
  • string::max_size() を超えるデータは扱えない
  • to_json() の結果に改行が入ってない

とかがダメポイントとなっております。wchar_t、wstring 対応ぐらいはすぐできそうだけどかったるくて放置。

アプリケーションの設定ファイルやログファイルを JSON にしたいとか、STL コンテナの中身をダンプしてデバッグしたいとか、そんなときにお手軽に使えるレベルのものにはなってるかと思います。ちゃんとした本格的なのをお望みの人は SpiderMonkey なんかを使うのがいいと思います。boost::spirit 使うやつは試してないのでわからん。