2014-10-28 2 views
2

yajl 2.0.4 (yajl_tree.h 사용)를 사용하여 JSON 파일을 구문 분석하려고하지만 발견 된 값이 배열인지 아닌지를 감지하는 데 문제가 있습니다 (내가 YAJL_IS_ARRAY를 사용하는 경우에도, 형식 필드가 설정되어 있지 않은 것 같다 여기 C에서 YAJL 트리를 사용하여 JSON 파일의 배열 감지 문제

내 JSON 파일입니다.이 코드를 사용하는 경우

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); 
     } 
    } 
} 

: 여기

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

내 코드입니다 나는 YAJL_IS_AR을 입력하지 않는다. 값이 배열 인 경우에도 RAY를 반환합니다 (예 : attribute). 그래서 YAJL_IS_ARRAY가 배열을 얻으려면 올바르지 않다면 무엇을 사용해야합니까? 또한, 내 개체 (obj, obj2 ...)의 형식이 올바른 형식이 아닌 것은 정상입니까? 내가 실수 한거야?

미리 도움을 주셔서 감사합니다. :)

답변

3

JSON이 배열이 아닙니다. 키 "장비"가있는 사전이고 "장비"의 값은 배열입니다. 이 경우 하나의 사전이 포함 된 배열입니다.

+0

감사! :) 배열과 객체 사이에 혼란이있었습니다. – chipou