컴퓨터지식나누기

JSON-C 사용예제 - JSON 객체에서 특정 키의 값 가져오기.

겨울아찌 2013. 5. 30. 15:43

C 프로그램에서 JSON 을 사용할 필요가 있었다.

검색해보니, https://github.com/json-c/json-c 이 최신 버전의 상태.

그런데, C 로 사용예제는 그리 많이 않은 편...


JSON 객체의 KEY 를 검색해서, VALUE 를 가져오는 것을 이해하는데... 이틀 정도 고생해서, JSON 객체가 포인터로 되어 있음을 이해서, 필요한 프로그램을 만들었다.


테스트 프로그램을 설명하면, 파일에서 JSON 포맷을 읽어서, 버퍼로 설정후, JSON 객체의 리스트를 만들고, json_find_obj 에 의해서, 필요한 객체를 탐색, 그 리턴 값으로, 타입과 value 를 가져오도록 구성한 프로그램이다.


#include <json/json.h>
#include <stdio.h>
#include <string.h>

json_object *json_find_obj (json_object * jobj, char *find_key)
{
        size_t key_len = strlen(find_key);
        json_object_object_foreach(jobj, key, val) {

            if (strlen(key) == key_len && !memcmp (key, find_key, key_len)) return val;
        }
        return NULL;    // not found.
}

int main(int argc, char *argv[]) {

        FILE *fp;
        char buffer[2048];

        fp = fopen (argv[1], "r");
        if (fp == NULL)
        {
                perror (argv[1]);
                exit (-1);
        }
        fgets (buffer, sizeof (buffer), fp);
        fclose (fp);

        json_object *jobj = json_tokener_parse(buffer);
//      json_parse(jobj);

        char *key = argv[2];
        enum json_type type;
        json_object *val = json_find_obj (jobj, key);
    type = json_object_get_type(val);
    switch (type) {
                case json_type_null:
                        printf("json_type_null\n");
                        break;
                case json_type_boolean:
                        printf("json_type_boolean (%s)", key);
                        printf("          value: %d\n", json_object_get_boolean(val));
                        break;
                case json_type_double:
                        printf("json_type_double (%s)", key);
                        printf("          value: %lf\n", json_object_get_double(val));
                        break;
                case json_type_int: printf("json_type_int (%s)", key);
                        printf("          value: %d\n", json_object_get_int(val));
                        break;
                case json_type_object: printf("json_type_object (%s)", key);
                        jobj = json_object_object_get(jobj, key);
                        json_parse(jobj);
                        break;
      case json_type_string: printf("json_type_string (%s)", key);
                        printf("          value: '%s'\n", json_object_get_string(val));
                        break;
    }

        json_object_put(jobj);
        exit (0);
}


실행한 예제의 결과는 아래와 같다.


[winchild@sandbox tmp]$ cat q1.txt
{"query":1,"key":["custno"],"custno":"고객번호"}
[winchild@sandbox tmp]$ ./jtest q1.txt query
json_type_int (query)          value: 1
[winchild@sandbox tmp]$ ./jtest q4.txt query
json_type_int (query)          value: 4
[winchild@sandbox tmp]$ ./jtest q1.txt custno
json_type_string (custno)          value: '고객번호'
[winchild@sandbox tmp]$

이 예제는 


에서 응용한 것이다.