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に組み込むなら、この取得した値をレコードデータとして突っ込めばいけるはず。