본문 바로가기
언어/C언어

json-c 라이브러리 사용 방법

by 코딩히어로 2022. 5. 16.
728x90

먼저 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 포맷을 만들고 파싱 하는 게 어려운 작업은 아닙니다

 

728x90
반응형

'언어 > 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

댓글