JSON-Cを使って値を取り出す
Cコード上でJSONをパースして値を取得するために、今回はJSON-Cを使うことにする。
これという選定基準はなく、JSONのページを調べて目についたので使ってみたというだけ。幸いライセンスもMITなので使いやすそうだ。
が、ドキュメントとサンプルコードの備えがビミョー・・・。サンプルコードは文字列からJSONオブジェクトを組み立てる例は結構詳しく載せているけど、JSON文字列をパースして取り出すサンプルがないっぽく見える。
まあ、ヘッダの関数宣言を見て、それっぽいのを組み合わせ試行錯誤したら、とりあえず今回の目的に必要な値の取得は出来るようになった。
コード例
以下の様なJSON文字列から、columnsを情報を取り出す。
{ "columns" : [ "n.name", "n.area?" ], "data" : [ [ "ぬこ@横浜", "横浜市" ], [ "ノヴナーガ", "名古屋市" ], [ "イエヤッス", "東京都" ] ] }
備忘のためにコード例を載せておく。
void print_columns(json_object* root_obj) { json_object *columns_obj; columns_obj = json_object_object_get(root_obj, "columns"); // printf("columns_obj=%s\n", json_object_to_json_string(columns_obj)); if (json_object_get_type(columns_obj) == json_type_array) { // 配列でした! int i; int array_num = json_object_array_length(columns_obj); // array_list* list = json_object_get_array(columns_obj); json_object* obj; for (i = 0; i < array_num; i++) { obj = json_object_array_get_idx(columns_obj, i); if (json_object_get_type(obj) == json_type_string) { printf("column(%d):%s\n", i, json_object_get_string(obj)); } } } }
この関数を呼び出すコード抜粋。json_stringに上で示したJSON文字列が入っている。
json_object *root_obj; root_obj = json_tokener_parse(json_string); if (root_obj == NULL) { fprintf(stderr, "json perse error.\n"); exit(-1); } // columnsの表示 print_columns(root_obj);
実行するとこんな感じ。
column(0):n.name column(1):n.area?
取得できた。dataの場合は配列の入れ子になっているから、同じような処理を入れ子で書けばOK。
今回はprintfで出力したけど、FDWに組み込むなら、この取得した値をレコードデータとして突っ込めばいけるはず。