- 最速と言われる JSON パーサ「rapidjson」が本当に爆速なのか試してみた。
- C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。
- 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。
- C言語から使えるJSONパーサ、JSMNを試してみた。
- 何も見ずにC++でjsonパーサが書けるか試してみた。
- ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い!
Jansson — C library for working with JSON data特徴としては
Jansson Jansson is a C library for encoding, decoding and manipulating JSON data. It features: Simpl...
http://www.digip.org/jansson/
- 簡単で直感的な API とデータモデル
- 包括的なドキュメント
- 他のライブラリへの依存がない
- ユニコードのフルサポート (UTF-8)
- 徹底したテストスーツ
#include <assert.h>
#include <string.h>
#include <memory.h>
#include <curl/curl.h>
#include <jansson.h>
typedef struct {
char* data; // response data from server
size_t size; // response size of data
} MEMFILE;
MEMFILE*
memfopen() {
MEMFILE* mf = (MEMFILE*) malloc(sizeof(MEMFILE));
if (mf) {
mf->data = NULL;
mf->size = 0;
}
return mf;
}
void
memfclose(MEMFILE* mf) {
if (mf->data) free(mf->data);
free(mf);
}
size_t
memfwrite(char* ptr, size_t size, size_t nmemb, void* stream) {
MEMFILE* mf = (MEMFILE*) stream;
int block = size * nmemb;
if (!mf) return block; // through
if (!mf->data)
mf->data = (char*) malloc(block);
else
mf->data = (char*) realloc(mf->data, mf->size + block);
if (mf->data) {
memcpy(mf->data + mf->size, ptr, block);
mf->size += block;
}
return block;
}
char*
memfstrdup(MEMFILE* mf) {
char* buf;
if (mf->size == 0) return NULL;
buf = (char*) malloc(mf->size + 1);
memcpy(buf, mf->data, mf->size);
buf[mf->size] = 0;
return buf;
}
int
main() {
CURL* curl;
MEMFILE* mf = NULL;
char* js = NULL;
int i;
mf = memfopen();
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_WRITEDATA, mf);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memfwrite);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
js = memfstrdup(mf);
memfclose(mf);
json_error_t error;
json_t *result = json_loads(js, 0, &error);
if (result == NULL) {
fputs(error.text, stderr);
goto leave;
}
json_t *repositories = json_object_get(result, "repositories");
json_t *repository;
json_array_foreach(repositories, i, repository) {
printf("%s/%s: %s\n",
json_string_value(json_object_get(repository, "username")),
json_string_value(json_object_get(repository, "name")),
json_string_value(json_object_get(repository, "description")));
}
json_decref(result);
leave:
free(js);
}
実行結果
mizzy/unko: テスト用
satorunet/unko:
siyo/unko: unko
kotatsumikan/unko: ファイルの内容を「うんこ」に変換するコマンドです。
karr3304/unko: ブログシステム
t11086/unko: 勉強中
keamano/unko: うんこアプリ
nmbakfm/unko: install unko command on your PC
nanananamememe/unko:
fivestar/unko: test
smellman/unko: まるでくそのようだ
susuhushi/unko: github
kjwtnb/unko: いろいろと書き捨て
kamiyama/xunko: unko
FromAtom/Test: Unko
tam33363/unko_wave:
konyavic/unko-curry:
konishika/unko_ng:
oilfield/unko_hakken: oilfield
tanaton/unko2ch: 2ちゃんねる過去ログ転送サービス
kenmaz/cocos2d_UnkoYoke: simple unko game
mattn/Plack-Middleware-ReplaceToUnko: plack middleware for replacing images to shit image that referer from external sites.
legokichi/superUnkoChanLv200: roombaProgramming
Plavender/Unkown:
omomuron/unkonow:
FanPF/unkown: I don't kown
ThievingSix/UnkosAMI:
nakajijapan/unkore_iphone: iPhone Game - Bureau of Nakajima Cleansing
比較する物としては parson が一番近いです。parson は各JSON 型がそれぞれ別のC言語型として扱われている為、value と object/array/number/boolean/string といったデータ型の交換が必要で、parson では json_value_get_array という関数の様に value → array という型変換はもちろん、array 内要素の value から目的の型への変換が必要になったりします。しかし jansson の場合は全て json_t 型のポインタで交換されていて、特に型交換する必要もなく、型チェックが必要な場合は json_is_array という関数でチェックが可能なのでとても直感的に、かつシームレスに処理が書けます。
そして parson の一番の欠点としてシリアライザが無い事が挙げられますが、jansson には存在します(json_dumps等)。
この点から見て、僕が把握しているC言語から使えるJSONパーサだと、現状 jansson が一番扱いやすいと思います。
ライセンスはMIT、チュートリアルが少ないですがAPIドキュメントはしっかり書いてあります。
ぜひ仕事でも使って行きたいと思います。