2018年1月14日日曜日

how to use Jansson

Janssonインストールしたけど、どう使うのか?
webにも、あんまり細かい事は出ていない
例えば、こんなデータの場合は?

[
{
    "RdcsId":"rcmp-r41",
    "Status":1,
    "NetIdLocal":"kk",
    "Agent":null,
    "Category":"4WD",
    "PlatformRbt":null,
    "NowRole":"tk001",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk0201", "mv0459"
        ],
        "Status": "Safe"
    }
},
{
    "RdcsId":"rcmp-r42",
    "Status":2,
    "NetIdLocal":"kk",
    "Agent":null,
    "Category":"4WD21",
    "PlatformRbt":null,
    "NowRole":"tk022",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk2222", "mv0459"
        ],
        "Status": "wait"
    }
},
{
    "RdcsId":"rcmp-r43",
    "Status":3,
    "NetIdLocal":"l0",
    "Agent":null,
    "Category":"4WD23",
    "PlatformRbt":null,
    "NowRole":"tk033",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk3333", "mv0459"
        ],
        "Status": "Safe"
    }
}
]

こういうデータに対しての使用方法を理解しないと困るので、、、
プログラムを作って、検証した。
で、一応、使い方は理解できたかもという話
インターネット経由のデータ処理が多いけど、プログラムのファイル読み込み部分がcurlのツールになる。
それは、JanssonのTutorialを見ればわかるので、、、
で、結果は、こんな感じで、、、まぁ、自己満足でごめんなさい。
プログラムはこんな感じ、、、
プログラムは、試行錯誤の跡、たっぷり(笑)
あっ
追記:Raspberry Piで、curlモジュール使うとき
sudo apt-get install libcurl4-openssl-dev

Peace!!

-------------- build ------------------------------------
gcc tst4.c -o tst4 -ljansson

-------------- program --------------------------------

#include <stdio.h>
#include <jansson.h>

//#define PRS(A)  printf("----->%s\n", A)

/************************************************/
int main(int argc, char *argv[])
{
    size_t i;
    int iCnt;

    json_t *root;
    json_error_t error;
    
    FILE    *outfl;

    /********************************************
    **     check arguments
    ********************************************/
    if(argc != 8){
        fprintf(stderr, "usage: %s file dumpfile keyword obj child-obj child-obj-array key\n\n", argv[0]);
        return 2;
    }
    
    if ((outfl = fopen(argv[2], "w")) == NULL) {
        fprintf(stderr, "error: file open.(%s)\n", argv[3]);
        return 1;
    }

    /********************************************
    **     convert jansson memory data
    ********************************************/
root = json_load_file(argv[1], 0, &error );
    if(!root){
        fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
        return 1;
    }

    // check array data
    if(!json_is_array(root)){
        fprintf(stderr, "error: root is not an array\n");
        json_decref(root);
        return 1;
    }

    iCnt = json_array_size(root);
    printf("array counts = %d\n", iCnt);
    
    for(i = 0; i < iCnt; i++){
        json_t *data, *value, *obj, *objv, *obj1, *obj11, *obj111;

        /*****************************************
        **     1. get one object
        *****************************************/
        // get obj
        data = json_array_get(root, i);
        json_dumpf(data, outfl, 256);
        
        if(!json_is_object(data)){
            fprintf(stderr, "error: data %d is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value
        value = json_object_get(data, argv[3]);
        if(!json_is_string(value)){
            fprintf(stderr, "error: obj no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[3]);
            return 1;
        }

        /*****************************************
        **     2. get object in object
        *****************************************/
        // get obj
        obj = json_object_get(data, argv[4]);
        if(!json_is_object(obj)){
            fprintf(stderr, "error: obj %d: is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value obj,obj
        objv = json_object_get(obj, argv[5]);
        if(!json_is_string(objv)){
            fprintf(stderr, "error: objv no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[5]);
            return 1;
        }
        
        /*****************************************
        **     3. get array value in object
        *****************************************/
        // get obj
        obj1 = json_object_get(data, argv[6]);
        //json_dumpf(obj1, stderr, 256);printf("\n");
        if(!json_is_object(obj1)){
            fprintf(stderr, "error: obj1 %d: is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value obj,obj
        obj11 = json_object_get(obj1, argv[7]);
        //printf("------------------------\n");
        //json_dumpf(obj11, stderr, 256);printf("\n");
        if(!json_is_array(obj11)){
            fprintf(stderr, "error: obj11 no. %d: keyword:%s is not a object\n", (int)(i + 1), argv[6]);
            return 1;
        }
        obj111 = json_array_get(obj11, 1);
        if(!json_is_string(obj111)){
            fprintf(stderr, "error: obj111 no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[7]);
            return 1;
        }
        /*****************************************
        **     4. print value
        *****************************************/
        printf("key:%s  value:%s obj:%s obj111:%s\n", 
            argv[3], json_string_value(value), json_string_value(objv),
            json_string_value(obj111));
    }
    
    /*********************************************
    **                                          **
    **     terminate                            **
    **                                          **
    *********************************************/
    json_decref(root);
    fclose(outfl);
    return 0;

}

0 件のコメント:

コメントを投稿