먼저 json-c 라이브러리를 이용해서 데이터를 만드는 방법은
json_object_new_object 함수를 이용해서 메모리를 할당받는 것으로 시작합니다
<json-c/json.h>
json_object *dataobj;
dataobj = json_object_new_object();
json_object_object_add(dataobj,"msg",json_object_new_int(1301));
json_object_object_add(dataobj,"sn",json_object_new_string(sn));
json_object_object_add(dataobj,"si",json_object_new_string(row[0]));
json_object_object_add(dataobj,"date",json_object_new_string(ldate));
json_object_object_add(dataobj,"time",json_object_new_string(ltime));
json_object_object_add(dataobj,"state",json_object_new_int(0));
json_object_object_add(dataobj,"values",json_object_new_string(""));
json_object_put(dataobj);
dataobj라는 json object에 메모리를 할당하고
json_object_object_add 함수를 이용해서 dataobj에 키&값을 넣어줍니다
데이터 값을 넣어줄 때에는 자료형에 맞는 함수를 호출해야 합니다
모든 키쌍이 추가되었으면 json_object_put을 호출하여 메모리를 해제합니다
{
"msg": 1301,
"sn": "Test1111",
"si": "ABC1234",
"date": "2022-5-16",
"time": "14:31",
"state": 0,
"values": ""
}
위 코드를 출력하면 json 포맷으로 출력이 가능합니다
만약 반대로 위에 결과물인 json 포맷의 데이터가 입력되었고
json의 키쌍 값을 파싱 하기 위해서는 다음과 같은 순서를 가집니다
<json-c/json.h>
json_object *myobj, *dataobj;
json_object *dval;
myobj = json_tokener_parse(payload);
dval = json_object_object_get(myobj, "msg");
if(dval!=NULL){
msg = json_object_get_int(dval);
}
dval = json_object_object_get(myobj, "sn");
if(dval!=NULL){
sn = json_object_get_string(dval);
}
...
myobj에 입력된 json 포맷의 문자열 payload를 할당하고
json_object_object_get 함수를 통해서 키값을 기준으로 데이터를 파싱 합니다
이렇게 데이터가 키쌍으로만 이루어진 경우는 간단하지만
만약에 json 포맷 내부에 배열을 가지고 있는 문자열의 경우 다음과 같이 파싱 합니다
{
"msg":1301
"date":2022-05-16
"array":[{"val":123}]
}
위에 항목 중 array는 배열을 나타내는 []가 사용되었습니다
json 포맷에서 []는 배열을 나타내며 그 안에 인자는 {}로 구분합니다
즉 [{}, {}] 의 경우에는 배열의 길이가 2가 됩니다
<json-c/json.h>
json_object *myobj, *dobj, *aobj, *dval;
int size, i;
myobj = json_tokener_parse(payload);
dval = json_object_object_get(myobj, "msg");
if(dval!=NULL){
msg = json_object_get_int(dval);
}
dval = json_object_object_get(myobj, "date");
if(dval!=NULL){
sn = json_object_get_string(dval);
}
dobj = json_object_object_get(myobj,"array");
size = json_object_array_length(dobj);
for(i=0;i<size;i++){
aval = json_object_array_get_idx(dobj, i);
dval = json_object_object_get(aval, "val");
printf("val = %s\n", json_object_get_string(dval);
}
배열의 경우 사이즈를 먼저 측정하고 그 사이즈에 따라 배열 인자를 파싱 합니다
배열의 안자 {} 하나 속에는 여러 개의 항목이 들어갈 수 있습니다
이렇듯이 json-c 라이브러리를 이용하면 json 포맷을 만들고 파싱 하는 게 어려운 작업은 아닙니다
'언어 > C언어' 카테고리의 다른 글
[c언어] 시간을 구하는 strftime 함수 (4) | 2022.08.05 |
---|---|
음수 표현 2의 보수 (4) | 2022.05.25 |
메모리 초기화 memset 함수 (8) | 2022.02.07 |
Struct, Union 응용 (14) | 2022.01.25 |
switch문 다중처리 (4) | 2022.01.11 |
댓글