概要
dropbox/json11はC++11対応のJSONライブラリで,初期化リストなどを使っていい感じに書けます.例えば,
{
"name": "Nana Mizuki",
"age": 34,
"songs": [
"ETERNAL BLAZE",
"innocent starter"
]
}
というJSONは,json11では
json11::Json json_dayo = json11::Json::object {
{"name" , "Nana Mizuki"},
{"age" , 34},
{"songs" , Json::array { "ETERNAL BLAZE", "innocent starter" } },
};
のように書けます.いい感じです.使い方はtest.cppを見ればわかるかと思います.
std::istreamからJsonオブジェクトに
JSONをパースしてjson11のオブジェクトにするには,json11:Json::parse関数を使いますが,引数がstd::stringかconst char*となっています.文字列で与えるということです.
std::istream (cinとかifstreamとか)からオブジェクトを作るにはストリーム→文字列→Jsonオブジェクトという流れになります.例えば
std::string buf, tmp;
while(std::getline(is,tmp) buf += tmp; //isはstd::istream
json11::Json json = json11::Json::parse(buf);
とか書いとけばいけます
g++でのコンパイル
使い方の例が書いてあるtest.cppが同梱されていますが,Makefileを見るとコンパイラがclang++になっているので,
ここではg++でmakeする場合の注意を書きます.
-
Makefileを次のように書き直すtest: json11.cpp json11.hpp test.cpp g++ -O -std=c++11 json11.cpp test.cpp -o test -fno-rtti -fno-exceptions -
test.cppに次を追記test.cpp#include "cstring.hpp"-
cstringをincludeしないと,test.cpp|92 col 66| error: 'memcmp' was not declared in this scopeとか言われます.
-
-
test.cppのvoid parse_from_stdin()という関数がうまく機能しないので,次のように書き換える.-
before
test.cppstring buf; while (!std::cin.eof()) buf += std::cin.get(); -
after
test.cppstring buf; string tmp; while (std::getline(std::cin, tmp)) buf += tmp; -
cin.getって位置文字ずつとるしなんかヤダなぁ・・・
-