C 언어로 JSON 데이터 파일로 저장하고 불러오기

C 언어에서 JSON 데이터를 파일로 저장하고 불러오는 방법을 알아보겠습니다. JSON은 데이터 교환에 널리 사용되는 형식으로, C 언어에서는 외부 라이브러리를 활용하여 JSON을 처리할 수 있습니다. 이 기사는 JSON 데이터를 파일로 저장하고 다시 불러오는 과정과 이를 구현하기 위한 실용적인 방법을 단계별로 설명합니다. C 언어로 JSON 데이터를 효율적으로 처리하는 방법을 익히고, 실제 프로젝트에서 적용할 수 있는 지식을 제공할 것입니다.

목차

C 언어에서 JSON 처리란?


JSON(JavaScript Object Notation)은 경량의 데이터 교환 형식으로, 사람과 기계가 모두 읽고 쓰기 쉽고, 언어나 플랫폼에 구애받지 않는 특성을 가집니다. C 언어에서 JSON을 처리하려면 JSON 포맷을 이해하고, 이를 파싱하거나 생성할 수 있는 방법을 마련해야 합니다.

C 언어는 기본적으로 JSON 처리를 위한 내장 함수나 라이브러리가 없기 때문에, JSON을 다루기 위한 외부 라이브러리, 예를 들어 cJSON, jansson, json-c 등이 필요합니다. 이러한 라이브러리는 JSON 문자열을 C 언어 구조체로 변환하거나, C 언어 구조체 데이터를 JSON 포맷으로 변환하는 기능을 제공합니다.

C 언어에서 JSON을 처리하려면 JSON 포맷의 데이터를 읽고, 변환하고, 저장하는 방법을 익히는 것이 중요합니다. 이를 통해 데이터 전송이나 저장 시 유용한 형식인 JSON을 효율적으로 사용할 수 있습니다.

JSON 라이브러리 사용법


C 언어에서 JSON 데이터를 처리하려면 외부 라이브러리를 사용하는 것이 일반적입니다. 가장 널리 사용되는 라이브러리 중 하나는 cJSON입니다. 이 라이브러리를 사용하면 JSON 데이터를 손쉽게 생성하고 파싱할 수 있습니다.

cJSON 라이브러리 설치


cJSON 라이브러리를 사용하려면 먼저 설치해야 합니다. 보통 GitHub에서 소스 코드를 다운로드하여 빌드하는 방법을 사용합니다. 설치 과정은 다음과 같습니다:

  1. cJSON 소스 코드 다운로드
    GitHub에서 cJSON의 최신 버전을 다운로드합니다.
   git clone https://github.com/DaveGamble/cJSON.git
  1. 빌드 및 설치
    소스 디렉토리로 이동한 후, 빌드를 진행합니다.
   cd cJSON
   mkdir build
   cd build
   cmake ..
   make
   sudo make install
  1. 헤더 파일과 라이브러리 연결
    cJSON 라이브러리의 헤더 파일과 빌드된 라이브러리를 C 프로그램에 연결해야 합니다. 이를 위해 컴파일 시 -lcjson 옵션을 추가하고, #include <cjson/cJSON.h>를 사용하여 헤더 파일을 포함시킵니다.

cJSON 사용 예시


다음은 cJSON을 사용하여 JSON 객체를 생성하고, 이를 파일에 저장하는 예시 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // JSON 객체 생성
    cJSON *root = cJSON_CreateObject();
    cJSON_AddStringToObject(root, "name", "John Doe");
    cJSON_AddNumberToObject(root, "age", 30);

    // JSON 데이터를 문자열로 변환
    char *json_string = cJSON_Print(root);

    // JSON 문자열을 파일에 저장
    FILE *file = fopen("data.json", "w");
    if (file) {
        fprintf(file, "%s", json_string);
        fclose(file);
    }

    // 메모리 해제
    free(json_string);
    cJSON_Delete(root);

    return 0;
}

위 예시에서 cJSON_CreateObject()를 사용하여 JSON 객체를 만들고, cJSON_AddStringToObject()cJSON_AddNumberToObject()를 통해 데이터를 추가합니다. 그런 다음 cJSON_Print()로 JSON 객체를 문자열로 변환하고, 파일에 저장합니다.

cJSON은 메모리 관리도 자동으로 하므로, 사용 후 cJSON_Delete()로 객체를 삭제하는 것을 잊지 않아야 합니다.

JSON 데이터 구조 이해


JSON은 데이터를 표현하는 경량 형식으로, 기본적으로 두 가지 주요 데이터 구조를 사용합니다: 객체배열. C 언어에서 JSON 데이터를 처리하려면 이러한 구조가 어떻게 구성되고, 이를 어떻게 C 코드에서 다룰지 이해하는 것이 중요합니다.

JSON 객체


JSON 객체는 {} 중괄호로 둘러싸인 키-값 쌍으로 구성됩니다. 각 키는 문자열이고, 값은 다양한 데이터 유형(문자열, 숫자, 배열 등)일 수 있습니다. C 언어에서는 cJSON_CreateObject() 함수로 JSON 객체를 생성하고, cJSON_AddStringToObject() 또는 cJSON_AddNumberToObject()와 같은 함수로 값을 추가할 수 있습니다.

예를 들어, 다음은 JSON 객체의 예시입니다:

{
  "name": "Alice",
  "age": 25
}

이 객체는 “name”이라는 키와 “Alice”라는 값, “age”라는 키와 25라는 값을 가집니다. C 언어에서는 cJSON_CreateObject()로 객체를 만들고, cJSON_AddStringToObject()로 문자열 값을 추가하거나, cJSON_AddNumberToObject()로 숫자 값을 추가할 수 있습니다.

JSON 배열


JSON 배열은 [] 대괄호로 둘러싸여 있으며, 여러 개의 값이 쉼표로 구분되어 나열됩니다. 배열의 값은 문자열, 숫자, 객체 등 다양한 데이터 유형이 될 수 있습니다. C 언어에서는 cJSON_CreateArray()로 배열을 생성하고, cJSON_AddItemToArray() 또는 cJSON_AddNumberToArray() 등을 사용하여 배열에 항목을 추가할 수 있습니다.

다음은 JSON 배열의 예시입니다:

{
  "fruits": ["apple", "banana", "cherry"]
}

이 예시에서 “fruits” 키에 배열이 할당되어 있으며, 배열은 “apple”, “banana”, “cherry”라는 문자열 값을 포함하고 있습니다.

C 언어에서 JSON 구조 다루기


C 언어에서 JSON 객체와 배열을 다룰 때, cJSON 라이브러리의 다양한 함수들을 활용하여 데이터를 생성하고 수정할 수 있습니다. 예를 들어, JSON 배열에 문자열 값을 추가하거나, 객체 안에 다른 객체를 넣을 수 있습니다. 이를 통해 복잡한 JSON 구조를 효과적으로 처리할 수 있습니다.

JSON 파일로 저장하기


C 언어에서 JSON 데이터를 파일에 저장하는 과정은, 먼저 데이터를 JSON 형식으로 변환한 후, 이를 파일에 작성하는 방식으로 이루어집니다. 이 과정에서 cJSON 라이브러리를 사용하면 JSON 객체를 쉽게 처리할 수 있습니다.

JSON 데이터 생성 후 파일에 저장하기


먼저, JSON 데이터를 메모리에서 생성하고, 그 데이터를 파일로 저장하는 기본적인 절차는 다음과 같습니다:

  1. JSON 객체 생성
  2. 데이터 추가
  3. JSON 객체를 문자열로 변환
  4. 파일에 저장

아래는 cJSON을 사용하여 데이터를 JSON 형식으로 생성하고, 이를 data.json 파일에 저장하는 예시 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // JSON 객체 생성
    cJSON *root = cJSON_CreateObject();
    cJSON_AddStringToObject(root, "name", "John Doe");
    cJSON_AddNumberToObject(root, "age", 30);
    cJSON_AddStringToObject(root, "city", "New York");

    // JSON 데이터를 문자열로 변환
    char *json_string = cJSON_Print(root);

    // 파일에 JSON 문자열 저장
    FILE *file = fopen("data.json", "w");
    if (file) {
        fprintf(file, "%s", json_string);
        fclose(file);
        printf("JSON 데이터가 'data.json' 파일에 저장되었습니다.\n");
    } else {
        printf("파일을 열 수 없습니다.\n");
    }

    // 메모리 해제
    free(json_string);
    cJSON_Delete(root);

    return 0;
}

이 코드는 "name", "age", "city"라는 키와 관련된 값을 포함하는 JSON 객체를 생성하고, 이를 data.json 파일에 저장합니다. cJSON_Print() 함수는 JSON 객체를 문자열로 변환하여 fprintf()를 사용해 파일에 기록합니다.

파일 저장 시 고려사항

  • 파일 경로: 저장할 파일의 경로를 정확히 지정해야 하며, 상대 경로나 절대 경로를 사용할 수 있습니다. 파일을 열 때 "w" 모드를 사용하면 기존 파일이 덮어씌워지며, "a" 모드를 사용하면 기존 파일에 데이터를 추가할 수 있습니다.
  • 파일 열기 실패 처리: 파일이 정상적으로 열리지 않는 경우를 대비해 오류 처리를 추가하는 것이 좋습니다.
  • 메모리 관리: cJSON_Print() 함수로 반환된 문자열은 동적으로 할당된 메모리이므로, 사용 후 반드시 free()를 호출해 메모리를 해제해야 합니다.

이와 같은 방법으로 C 언어에서 JSON 데이터를 파일로 저장하고, 이를 나중에 다시 읽어올 수 있는 기반을 마련할 수 있습니다.

파일에서 JSON 데이터 불러오기


C 언어에서 파일로 저장된 JSON 데이터를 읽어오는 과정은 JSON 파일을 열고, 그 내용을 cJSON 객체로 파싱하는 절차로 이루어집니다. 이 과정은 저장된 JSON 파일을 읽어 메모리로 로드한 후, 필요한 데이터에 접근할 수 있게 해줍니다.

파일에서 JSON 데이터 읽기


먼저, 파일을 열어 그 내용을 읽고, 읽은 문자열을 cJSON_Parse() 함수를 사용하여 JSON 객체로 파싱합니다. 파일에서 JSON 데이터를 불러온 후, JSON 객체를 통해 데이터를 추출하거나 수정할 수 있습니다.

아래는 data.json 파일에서 JSON 데이터를 읽고, 이를 파싱한 후 “name”과 “age” 값을 출력하는 예시 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // 파일 열기
    FILE *file = fopen("data.json", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    // 파일 크기 구하기
    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET);

    // 파일 내용을 메모리로 읽기
    char *file_content = (char *)malloc(file_size + 1);
    if (file_content == NULL) {
        printf("메모리 할당에 실패했습니다.\n");
        fclose(file);
        return 1;
    }
    fread(file_content, 1, file_size, file);
    fclose(file);
    file_content[file_size] = '\0';  // null-terminate the string

    // JSON 데이터 파싱
    cJSON *root = cJSON_Parse(file_content);
    if (root == NULL) {
        printf("JSON 파싱에 실패했습니다.\n");
        free(file_content);
        return 1;
    }

    // JSON 데이터에서 값 추출
    cJSON *name = cJSON_GetObjectItem(root, "name");
    cJSON *age = cJSON_GetObjectItem(root, "age");

    if (name && age) {
        printf("이름: %s\n", name->valuestring);
        printf("나이: %d\n", age->valueint);
    } else {
        printf("JSON 데이터에 'name' 또는 'age' 항목이 없습니다.\n");
    }

    // 메모리 해제
    free(file_content);
    cJSON_Delete(root);

    return 0;
}

위 예시에서 파일을 열고, fread()를 사용하여 파일 내용을 메모리로 읽은 후, cJSON_Parse() 함수로 JSON 객체를 생성합니다. 그런 다음 cJSON_GetObjectItem()을 사용하여 “name”과 “age” 값을 추출하고 출력합니다.

파일에서 JSON 데이터를 읽을 때 고려해야 할 사항

  • 파일 크기: 파일 크기를 구할 때 fseek()ftell()을 사용하여 파일 크기를 확인한 후 메모리를 할당합니다. 이 방식은 작은 파일에는 유용하지만, 매우 큰 파일에서는 메모리 문제가 발생할 수 있습니다. 이 경우에는 스트리밍 방식으로 파일을 읽는 것이 좋습니다.
  • 메모리 관리: JSON 데이터 파싱 후 cJSON_Delete()로 메모리를 해제해야 합니다. 또한, malloc()으로 할당한 메모리도 사용 후 반드시 free()를 호출해 해제해야 합니다.
  • 오류 처리: 파일 열기나 JSON 파싱 시 오류가 발생할 수 있으므로 이를 처리할 코드를 추가하는 것이 중요합니다.

이 과정을 통해 C 언어에서 JSON 파일을 읽고, 그 데이터를 프로그램에서 유용하게 활용할 수 있습니다.

JSON 객체의 데이터 수정


C 언어에서 JSON 데이터를 불러온 후, 해당 데이터를 수정하고 다시 파일에 저장하는 과정은 간단한 JSON 객체 수정 기능을 제공합니다. cJSON 라이브러리에서는 객체 내 데이터를 수정하는 다양한 함수를 제공하며, 수정 후에는 변경된 데이터를 다시 파일에 저장할 수 있습니다.

JSON 데이터 수정하기


기존 JSON 데이터를 읽어온 후, 특정 항목의 값을 수정하는 방법은 간단합니다. cJSON_GetObjectItem() 함수로 수정할 항목을 가져온 후, 해당 항목에 대해 새로운 값을 설정합니다. 예를 들어, “name” 값을 수정하거나, “age” 값을 변경할 수 있습니다.

다음은 기존 JSON 파일에서 데이터를 수정하고, 이를 다시 파일에 저장하는 예시 코드입니다:

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // 파일에서 JSON 데이터 읽기
    FILE *file = fopen("data.json", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET);

    char *file_content = (char *)malloc(file_size + 1);
    if (file_content == NULL) {
        printf("메모리 할당에 실패했습니다.\n");
        fclose(file);
        return 1;
    }
    fread(file_content, 1, file_size, file);
    fclose(file);
    file_content[file_size] = '\0';

    // JSON 파싱
    cJSON *root = cJSON_Parse(file_content);
    if (root == NULL) {
        printf("JSON 파싱에 실패했습니다.\n");
        free(file_content);
        return 1;
    }

    // 데이터 수정: "name"을 "Alice"에서 "Bob"으로 수정
    cJSON *name = cJSON_GetObjectItem(root, "name");
    if (name) {
        cJSON_SetValuestring(name, "Bob");
    }

    // 데이터 수정: "age" 값을 30에서 35로 수정
    cJSON *age = cJSON_GetObjectItem(root, "age");
    if (age) {
        cJSON_SetNumberValue(age, 35);
    }

    // 수정된 JSON 데이터를 문자열로 변환
    char *json_string = cJSON_Print(root);

    // 수정된 JSON 데이터를 파일에 저장
    file = fopen("data.json", "w");
    if (file) {
        fprintf(file, "%s", json_string);
        fclose(file);
        printf("JSON 데이터가 수정되어 'data.json' 파일에 저장되었습니다.\n");
    } else {
        printf("파일을 열 수 없습니다.\n");
    }

    // 메모리 해제
    free(file_content);
    free(json_string);
    cJSON_Delete(root);

    return 0;
}

이 코드는 data.json 파일에서 데이터를 읽고, “name” 값을 “Bob”으로 변경하며, “age” 값을 35로 수정한 후, 수정된 JSON 데이터를 다시 파일에 저장합니다. cJSON_SetValuestring()cJSON_SetNumberValue()를 사용하여 값을 수정할 수 있습니다.

데이터 수정 시 고려사항

  • 기존 값 검증: 데이터를 수정하기 전에 해당 항목이 존재하는지 확인하는 것이 좋습니다. 예를 들어, "name"이나 "age" 키가 JSON 객체에 없으면 수정할 수 없습니다.
  • 메모리 관리: 수정 후 cJSON_Print()로 문자열을 생성한 후, 그 문자열을 파일에 기록합니다. 이때, 메모리 할당된 문자열과 JSON 객체는 사용 후 반드시 해제해야 합니다.
  • 파일 열기 실패 처리: 수정된 JSON 데이터를 저장할 때 파일이 정상적으로 열리지 않으면 적절한 오류 처리를 추가하는 것이 중요합니다.

이와 같은 방식으로 C 언어에서 JSON 데이터를 수정하고 다시 저장하는 방법을 구현할 수 있습니다.

JSON 처리 시 주의사항


C 언어에서 JSON 데이터를 다룰 때 몇 가지 주의해야 할 사항이 있습니다. JSON 처리 과정에서 발생할 수 있는 오류를 방지하고, 효율적으로 데이터를 관리하기 위한 팁을 소개합니다.

1. 메모리 관리


C 언어에서 JSON 데이터를 처리할 때 가장 중요한 점 중 하나는 메모리 관리입니다. cJSON_Print()와 같은 함수로 반환되는 문자열은 동적으로 할당된 메모리이므로, 사용 후 반드시 free()를 호출하여 메모리를 해제해야 합니다. 또한, cJSON_CreateObject()cJSON_Parse()로 생성된 JSON 객체도 사용 후 cJSON_Delete()로 메모리에서 해제해야 합니다. 메모리 누수를 방지하려면 이를 철저히 관리해야 합니다.

free(json_string);   // 문자열 메모리 해제
cJSON_Delete(root);   // JSON 객체 메모리 해제

2. 파일 읽기/쓰기 오류 처리


파일을 읽거나 쓸 때 오류가 발생할 수 있으므로 파일을 열기 전에 반드시 파일 열기 실패 처리를 해야 합니다. 파일을 성공적으로 열지 못한 경우, 프로그램은 오류를 출력하고 종료할 수 있도록 처리하는 것이 좋습니다.

FILE *file = fopen("data.json", "r");
if (file == NULL) {
    printf("파일을 열 수 없습니다.\n");
    return 1;
}

3. JSON 데이터의 유효성 검사


cJSON_Parse() 함수로 JSON 문자열을 파싱할 때, 유효한 JSON 형식이 아닌 경우 파싱에 실패할 수 있습니다. 따라서 JSON 문자열이 유효한지 반드시 확인해야 하며, 파싱 실패 시 적절한 오류 메시지를 출력하고 처리할 수 있도록 해야 합니다.

cJSON *root = cJSON_Parse(file_content);
if (root == NULL) {
    printf("JSON 파싱에 실패했습니다.\n");
    return 1;
}

4. JSON 키의 존재 여부 확인


JSON 객체에서 특정 키를 찾을 때, 해당 키가 존재하지 않으면 NULL을 반환합니다. 따라서 cJSON_GetObjectItem()으로 값을 추출할 때, 키가 존재하는지 확인해야 합니다. 존재하지 않는 키에 접근하려고 하면 프로그램이 예기치 않게 동작할 수 있습니다.

cJSON *name = cJSON_GetObjectItem(root, "name");
if (name == NULL) {
    printf("'name' 키가 JSON에 존재하지 않습니다.\n");
}

5. 대용량 파일 처리 시 성능 고려


파일 크기가 매우 크거나 JSON 구조가 복잡한 경우, 메모리 사용량과 처리 시간이 늘어날 수 있습니다. 이러한 경우, JSON 데이터를 스트리밍 방식으로 읽거나 처리하는 방법을 고려해야 합니다. 한 번에 모든 데이터를 메모리에 로드하는 대신, 데이터를 부분적으로 처리하는 방식이 효율적일 수 있습니다.

6. 포맷팅과 가독성


cJSON_Print()는 기본적으로 JSON 데이터를 문자열로 변환할 때 가독성 좋은 형태로 출력합니다. 하지만 cJSON_PrintUnformatted()를 사용하면 공백이나 들여쓰기를 제거하여 JSON 문자열을 압축된 형태로 저장할 수 있습니다. 이 방법은 파일 크기를 최소화할 때 유용합니다.

char *json_string = cJSON_PrintUnformatted(root); // 압축된 형태

7. 파일 경로와 권한 관리


파일을 저장할 때 경로와 파일 권한을 고려해야 합니다. 특히, 파일을 쓰기 전에 경로가 존재하는지 확인하고, 프로그램이 해당 파일에 쓸 수 있는 권한이 있는지 확인해야 합니다. 그렇지 않으면 파일 저장에 실패할 수 있습니다.

8. 다양한 JSON 형식 다루기


JSON은 단순한 키-값 쌍뿐만 아니라 배열, 중첩된 객체 등 다양한 형식을 포함할 수 있습니다. 이를 처리할 때는 JSON 구조를 제대로 파악하고, cJSON의 다양한 함수들(cJSON_AddItemToObject(), cJSON_AddItemToArray(), cJSON_GetArraySize() 등)을 사용하여 데이터를 처리해야 합니다.

결론


C 언어에서 JSON을 처리할 때는 메모리 관리, 오류 처리, 데이터의 유효성 검증 등이 중요합니다. 또한, 큰 파일을 처리할 때는 성능을 고려하고, JSON 데이터의 복잡성에 맞는 적절한 방법을 선택해야 합니다. 이 모든 사항을 잘 지키면 C 언어에서도 안정적이고 효율적으로 JSON을 처리할 수 있습니다.

실용적인 예시 코드


C 언어로 JSON 데이터를 파일에 저장하고 불러오는 실용적인 예시를 제공하여, 실제 프로젝트에서 JSON 파일 처리 방법을 익힐 수 있도록 합니다. 이 예시는 JSON 데이터를 저장하고 불러오는 기본적인 흐름을 다룹니다.

1. JSON 파일 저장 예시


이 예시에서는 cJSON을 사용하여 JSON 객체를 생성하고, 이를 data.json 파일에 저장하는 방법을 보여줍니다.

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // JSON 객체 생성
    cJSON *root = cJSON_CreateObject();
    cJSON_AddStringToObject(root, "name", "Alice");
    cJSON_AddNumberToObject(root, "age", 28);
    cJSON_AddStringToObject(root, "city", "Los Angeles");

    // JSON 데이터를 문자열로 변환
    char *json_string = cJSON_Print(root);

    // 파일에 JSON 문자열 저장
    FILE *file = fopen("data.json", "w");
    if (file) {
        fprintf(file, "%s", json_string);
        fclose(file);
        printf("JSON 데이터가 'data.json' 파일에 저장되었습니다.\n");
    } else {
        printf("파일을 열 수 없습니다.\n");
    }

    // 메모리 해제
    free(json_string);
    cJSON_Delete(root);

    return 0;
}

이 코드는 name, age, city 항목을 포함하는 JSON 객체를 생성하고, 이를 data.json 파일에 저장합니다.

2. JSON 파일 읽기 및 수정 예시


다음 예시는 JSON 파일에서 데이터를 읽어와 수정한 후, 다시 파일에 저장하는 방법을 다룹니다.

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // 파일에서 JSON 데이터 읽기
    FILE *file = fopen("data.json", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET);

    char *file_content = (char *)malloc(file_size + 1);
    if (file_content == NULL) {
        printf("메모리 할당에 실패했습니다.\n");
        fclose(file);
        return 1;
    }
    fread(file_content, 1, file_size, file);
    fclose(file);
    file_content[file_size] = '\0';

    // JSON 파싱
    cJSON *root = cJSON_Parse(file_content);
    if (root == NULL) {
        printf("JSON 파싱에 실패했습니다.\n");
        free(file_content);
        return 1;
    }

    // 데이터 수정: "name"을 "Alice"에서 "Bob"으로 수정
    cJSON *name = cJSON_GetObjectItem(root, "name");
    if (name) {
        cJSON_SetValuestring(name, "Bob");
    }

    // 수정된 JSON 데이터를 문자열로 변환
    char *json_string = cJSON_Print(root);

    // 수정된 JSON 데이터를 파일에 저장
    file = fopen("data.json", "w");
    if (file) {
        fprintf(file, "%s", json_string);
        fclose(file);
        printf("JSON 데이터가 수정되어 'data.json' 파일에 저장되었습니다.\n");
    } else {
        printf("파일을 열 수 없습니다.\n");
    }

    // 메모리 해제
    free(file_content);
    free(json_string);
    cJSON_Delete(root);

    return 0;
}

이 코드는 data.json 파일에서 “name” 항목을 읽어 수정한 후, 수정된 내용을 다시 파일에 저장합니다. JSON 데이터를 파싱하고, 값을 수정한 후, 파일에 다시 저장하는 과정입니다.

3. JSON 데이터 읽기 및 출력 예시


마지막으로, JSON 파일에서 데이터를 읽고, 특정 항목을 출력하는 예시입니다.

#include <stdio.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main() {
    // 파일에서 JSON 데이터 읽기
    FILE *file = fopen("data.json", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET);

    char *file_content = (char *)malloc(file_size + 1);
    if (file_content == NULL) {
        printf("메모리 할당에 실패했습니다.\n");
        fclose(file);
        return 1;
    }
    fread(file_content, 1, file_size, file);
    fclose(file);
    file_content[file_size] = '\0';

    // JSON 파싱
    cJSON *root = cJSON_Parse(file_content);
    if (root == NULL) {
        printf("JSON 파싱에 실패했습니다.\n");
        free(file_content);
        return 1;
    }

    // JSON 데이터에서 값 추출
    cJSON *name = cJSON_GetObjectItem(root, "name");
    cJSON *age = cJSON_GetObjectItem(root, "age");

    if (name && age) {
        printf("이름: %s\n", name->valuestring);
        printf("나이: %d\n", age->valueint);
    } else {
        printf("JSON 데이터에 'name' 또는 'age' 항목이 없습니다.\n");
    }

    // 메모리 해제
    free(file_content);
    cJSON_Delete(root);

    return 0;
}

이 예시에서는 JSON 파일에서 “name”과 “age” 값을 추출하여 출력하는 방식입니다.

결론


위 예시들은 C 언어에서 JSON 파일을 저장하고 불러오는 기본적인 사용 방법을 설명합니다. cJSON 라이브러리를 활용하여 JSON 객체를 생성, 수정, 파싱 및 저장하는 방법을 익힐 수 있으며, 실용적인 프로젝트에서 이 기법들을 확장하여 활용할 수 있습니다.

요약


본 기사는 C 언어에서 JSON 데이터를 파일로 저장하고 불러오는 방법에 대해 설명했습니다. cJSON 라이브러리를 활용하여 JSON 객체를 생성하고, 이를 파일에 저장하며, 파일에서 JSON 데이터를 읽어 수정하거나 출력하는 방법을 단계별로 다루었습니다. 또한, JSON 처리 시 메모리 관리, 오류 처리, 데이터 유효성 검증 등 주의해야 할 사항을 설명하였습니다. 이러한 기법들은 C 언어를 이용한 JSON 데이터 처리의 기본적인 흐름을 이해하는 데 도움을 주며, 실제 프로젝트에 효과적으로 적용할 수 있습니다.

목차