JSON(JavaScript Object Notation)은 데이터를 저장하고 교환하는 데 사용되는 가벼운 데이터 형식이다.
주로 네트워크, 파일입출력, 서버와 클라이언트 간 데이터 전송에 활용되며,
데이터를 객체(Object)와 배열(Array)로 저장한다. ( 객체={ } , 배열=[ ] )
C에서는 json을 지원하지 않아 cJSON과 jsmn이라는 라이브러리를 사용 해야한다.
typedef struct cJSON
{
struct cJSON *next; // 배열이나 객체의 다음 항목을 가리킴
struct cJSON *prev; // 배열이나 객체의 이전 항목을 가리킴
struct cJSON *child; // 객체나 배열의 자식 항목을 가리킴
int type; // 항목의 타입 (문자열, 숫자 등)
char *valuestring; // 값이 문자열일 경우, 해당 문자열을 가리킴
int valueint; // 값이 정수일 경우, 해당 정수 값을 저장
double valuedouble; // 값이 실수일 경우, 해당 실수 값을 저장
char *string; // 항목의 이름 (객체 안에서만 사용)
} cJSON;
그 중에 cJSON 라이브러리를 사용하면, cJSON 이라는 구조체를 제공한다.
이 구조체는 C언어에서 JSON 데이터를 처리할 때 사용하는 데이터 구조이다.
🌳 cJSON의 JSON 데이터 형식은 [트리 구조]이다.
트리 구조란, 부모-자식처럼 계층구조로 데이터를 저장하는 방법을 뜻한다.
트리(tree) = "나무처럼 생긴 데이터 구조"
- 하나의 "부모" 노드가 있고,
- 그 밑에 여러 "자식" 노드가 달려 있다.
- 자식 노드에도 또 자식이 생길 수 있다.
- 최상단 노드를 루트(root) 라고 부른다.
- 루트는 배열일수도, 객체일수도 있다.
루트는 JSON 데이터 전체를 대표하는 하나의 큰 객체 or 배열 이다.
보통 루트가 배열이면 여러 객체를 담고, 루트가 객체이면 그 안에 또 배열이 들어갈 수도 있다.
배열 루트 - > 객체가 여러개
객체 루트 - > 배열이 여러개
< 중첩구조 >
값이 객체일 수 도, 배열일 수 도 있다.
이것이 가능한 이유는 JSON이 계층구조이기 때문이다.
도서 목록의 경우 객제+배열로 이루어진 혼합구조이다.
{
"name": "Lee",
"age": 30,
"isStudent": false
}
- { } → 객체(object)
- 키(Key) : 값(Value) 구조
- "name": "Lee" → key: value 쌍
- 문자열은 "따옴표"로 감싸
- 키는 항상 문자열이어야 하며, 값은 문자열, 숫자, 불리언, 배열, 객체 등을 사용할 수 있음
// 구조체가 없을 때
char title[100];
char author[50];
char isbn[20];
int isBorrowed;
// 구조체가 있을 때
struct Book {
char title[100];
char author[50];
char isbn[20];
int isBorrowed;
};
Q. json 파일을 파싱할 때, 꼭 구조체를 써야하는가?
A. X. 꼭 구조체만 써야하는건 아니다.
JSON 파일은 문자열로 구성되어 있는데, 마치 구조체 같이 생겼지만
실상 { "name": "Lee", "age": 30, "isStudent": false } 이렇게 한 줄이다.
단지 여러개의 키-값을 보기 좋게 한 줄에 한 쌍씩 적어서 표현하다보니,
구조체와 비슷하게 생겨서 구조체를 사용하는 것 이다. ( Key = 구조체 멤버들 )
그리고 구조체를 쓰면 정보를 묶어서 관리 할 수 있고, 함수를 만들 때도 구조체 하나만 넘기면 되니 간편해진다.
cJSON 구조체가 사용되는 방식
- 객체 생성: cJSON_CreateObject나 cJSON_CreateArray와 같은 함수로 JSON 객체나 배열을 생성합니다.
- 값 추가: cJSON_AddStringToObject, cJSON_AddNumberToObject 등으로 객체에 값을 추가합니다.
- 출력: cJSON_Print나 cJSON_PrintUnformatted로 JSON 문자열을 출력합니다.
- 파싱: cJSON_Parse를 사용하여 JSON 문자열을 cJSON 구조체로 파싱합니다.
- 자원 해제: cJSON_Delete로 메모리를 해제합니다.
*파싱(parsing)이란, 문자열(텍스트)를 프로그램에 사용 할 수 있도록 변환하는 것을 뜻한다.
< 연습 >
1. 도서정보를 담을 struct Book 구조체 정의
2. 책 1권을 JSON으로 만들기
3. JSON을 파일로 저장하기 (books.json)
4. 파일에서 JSON 읽기
5. JSON → 구조체로 다시 변환하기
'C언어' 카테고리의 다른 글
유저찾기 번호노출 수정 (0) | 2025.04.07 |
---|---|
유저찾기 (0) | 2025.04.06 |
반환값으로 문자열을 반환하는 함수 만들기 (0) | 2025.04.05 |
0404 개발일지 (0) | 2025.04.04 |
파일 입출력 (0) | 2025.04.03 |