おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。
- 最速と言われる JSON パーサ「rapidjson」が本当に爆速なのか試してみた。
- C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。
- 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。
- C言語から使えるJSONパーサ、JSMNを試してみた。
- 何も見ずにC++でjsonパーサが書けるか試してみた。
- ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い!
- C言語から使えるJSONパーサ、jansson がとても直感的で良い
今回は json11 というライブラリ。
dropbox/json11 - GitHub
https://github.com/dropbox/json11
あの Dropboxが書いてる。C++ から使える JSON ライブラリは幾つかありますが、initializer_list が使える物がなかなか少ない。
json11 は以下の様に書ける。
Json my_json = Json::object {
{ "key1", "value1" },
{ "key2", false },
{ "key3", Json::array { 1, 2, 3 } },
};
前回の jansson の記事で使ったサンプルを json11 で書くと以下の様になります。
※ネットワーク通信部分は前回のコードよりも省略しています
C++11 向けライブラリですのでコンパイル時のコマンドラインオプションに -std=c++11
を付ける必要があります。
#include <iostream>
#include "json11.hpp"
#include <curl/curl.h>
size_t
stream_write(char* ptr, size_t size, size_t nmemb, void* stream) {
((std::string*) stream)->append(std::string(ptr, size * nmemb));
return size * nmemb;
}
int
main() {
CURL* curl;
std::string buf;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "https://api.github.com/legacy/repos/search/unko");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buf);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, stream_write);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
std::string err;
json11::Json v = json11::Json::parse(buf, err);
for (auto &k : v["repositories"].array_items()) {
std::cout << k["username"].string_value() << std::endl;
std::cout << k["name"].string_value() << std::endl;
std::cout << k["description"].string_value() << std::endl << std::endl;
}
}
とてもきれい。ライセンスは MIT なので業務でも使えます。