cJSON 기본 개념

2025. 4. 27. 19:51·C언어

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 구조체가 사용되는 방식

  1. 객체 생성: cJSON_CreateObject나 cJSON_CreateArray와 같은 함수로 JSON 객체나 배열을 생성합니다.
  2. 값 추가: cJSON_AddStringToObject, cJSON_AddNumberToObject 등으로 객체에 값을 추가합니다.
  3. 출력: cJSON_Print나 cJSON_PrintUnformatted로 JSON 문자열을 출력합니다.
  4. 파싱: cJSON_Parse를 사용하여 JSON 문자열을 cJSON 구조체로 파싱합니다.
  5. 자원 해제: 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
'C언어' 카테고리의 다른 글
  • 유저찾기 번호노출 수정
  • 유저찾기
  • 반환값으로 문자열을 반환하는 함수 만들기
  • 0404 개발일지
joo_coding
joo_coding
2025.02.18~
  • joo_coding
    주코딩일지
    joo_coding
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • 일지 (19)
      • 계획표 (7)
      • C언어 (35)
        • 연습장 (12)
      • 과제 (2)
      • C++ (3)
      • python (28)
        • 연습장 (11)
      • TCP IP (4)
      • DB (2)
      • ubuntu (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어 #vscode #gcc #윈도우 #c언어윈도우 #gcc윈도우 #vscode윈도우 #c #c++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
joo_coding
cJSON 기본 개념
상단으로

티스토리툴바