3

yajl 2.0.4 を使用して (yajl_tree.h を使用して) JSON ファイルを解析しようとしましたが、見つかった値が配列であるかどうかを検出するのに問題があります (YAJL_IS_ARRAY を使用しても、型フィールドが設定されていないようです.

ここに私のJSONファイルがあります:

{
    "equipment": [
        {
            "name": "mynode",
            "type": "node",
            "attribute": [
                {
                    "name": "cpu_available",
                    "value": "8"
                },
                {
                    "name": "memory_available",
                    "value": "24"
                }
            ]
        }
    ]
}

これが私のコードです:

const char *path[] = { "equipment", (const char *) 0 };
yajl_val v = yajl_tree_get( node, path, yajl_t_array );
if ( v && YAJL_IS_ARRAY( v ) ) {
    for ( i = 0; i < v->u.array.len; i++ ) {
        yajl_val obj = v->u.array.values[i];
        if( obj && YAJL_IS_ARRAY(obj)) {
            for ( j = 0; j < obj->u.object.len; j++ ) {
                yajl_val obj2 = obj->u.array.values[ j ];
                if(obj2 && YAJL_IS_ARRAY(obj2)) {
                    for ( k = 0; k < obj2->u.array.len; k++ ) {
                        yajl_val obj3 = obj->u.array.values[ k ];
                        const char * key3 = obj3->u.object.keys[ k ];
                        yajl_val val3 = obj3->u.object.values[ k ];
                            printf( "      %s : %s \n", key3, val3->u.string );
                    }
                }
                else {
                    const char * key2 = obj->u.object.keys[ j ];
                    yajl_val val2 = obj->u.object.values[ j ];
                        printf( "    %s : %s \n", key2, val2->u.string );
                }
            }
        }
        else {
            const char * key = obj->u.object.keys[ i ];
            yajl_val val = obj->u.object.values[ i ];
                printf( "  %s : %s ", key, val->u.string );
        }
    }
}

このコードを使用すると、属性などの値が配列であっても、YAJL_IS_ARRAY を入力しません。それで、配列を取得するために YAJL_IS_ARRAY が正しくないかどうか疑問に思っていました。何を使用する必要がありますか? さらに、オブジェクトの型 (obj、obj2...) に正しい型がないのは正常ですか? 私はどんな間違いをしましたか?

よろしくお願いします。:)

4

1 に答える 1