본문 바로가기

C언어/C_지식_정리

[C 언어] JSON 파일을 이용해서 데이터 받아오기

 

kgabis/parson

Lightweight JSON library written in C. Contribute to kgabis/parson development by creating an account on GitHub.

github.com

C에서 JSON 파일을 읽어들여서 사용할 수 있는 오픈소스코드이다.

들어가서 ZIP파일로 다운받고 압축을 풀면된다.

압축을 풀고 나서 나온 폴더 내부에 parson.c 와 parson.h를 복사해서

JSON 파일을 사용할 프로젝트 폴더에서 .c 파일과 .h파일들이 있는곳에 넣으면 된다. 

사용할 JSON 파일도 역시 같은 폴더에 넣으면 된다.

example.json
{
    "Num": 1,
    "Greeting": "Hello",
    "DNum": 1.5,
    "array": [1,2,3,4,5],
    "boolean": true
}

이렇게 되면 사용 준비는 마쳤다.


이제 사용할 프로젝트를 열어서 소스파일에 추가 > 기존 항목 > parson.c 를 해서 소스파일에 추가하고,

 

마찬가지로 헤더파일에도 추가 > 기존 항목 > parson.h 를 추가하면 된다.

이제, main.c 파일에 parson.h 헤더파일을 추가시켜주고 밑에처럼 코드를 작성한다.

JSON parson
#include <stdio.h>
#include "parson.h"

int main()
{
	JSON_Value *rootValue;
	JSON_Object *rootObject;

	rootValue = json_parse_file("example.json");    
	rootObject = json_value_get_object(rootValue); 

	return 0;
}

 

위에 코드가 .json 파일을 파싱해서 객체를 가져오는 단계이다.

이제, JSON에서 파일들을 가져오기만 하면 된다.

JSON parson ex)
#include <stdio.h>
#include "parson.h"

int main()
{
	JSON_Value *rootValue;
	JSON_Object *rootObject;

	rootValue = json_parse_file("example.json");    
	rootObject = json_value_get_object(rootValue);

	printf("Greeting: %s\n", json_object_get_string(rootObject, "Greeting"));
	printf("Num: %d\n", (int)json_object_get_number(rootObject, "Num"));
	printf("DNum: %.1lf\n", json_object_get_number(rootObject, "DNum"));

	printf("array: ");
	JSON_Array *array = json_object_get_array(rootObject, "array");
	for (int i = 0; i < json_array_get_count(array); i++)    
	{
		printf("%d ", (int)json_array_get_number(array, i));
	}

	printf("\nboolean: %d\n", json_object_get_boolean(rootObject, "boolean"));

	json_value_free(rootValue);
	return 0;
}

(실행결과)

문자는 그대로 가져오면 되고,

기본적으로 숫자를 파싱해서 값을 가져올때는 실수형(double)로 가져오기때문에

정수를 가져오고 싶으면 형변환을 해줘서 가져와야한다. 

배열은 json_object_get_array 함수를 이용해 먼저 배열의 포인터를 가져오고나서, json_object_get_count를 이용해서 배열의 요소 개수만큼 반복을 시키면, 배열을 가져올 수 있게 된다.

참, 거짓은 가져왔을때 각각 1, 0으로 바뀌게 된다.

그리고 동적 메모리를 사용하기 때문에 마지막에 동적 메모리를 해제 해줘야 한다.(rootValue)를 해제하면 자동으로 rootObject도 해제된다.