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]$
이 예제는
에서 응용한 것이다.