概要
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って位置文字ずつとるしなんかヤダなぁ・・・