본문 바로가기
프로그래밍/C++

C++ ] JSON 데이터 포맷, rapidjson 라이브러리 사용해 파싱

by eteo 2023. 5. 14.

 

JSON 데이터 포맷

 

 

JSON(JavaScript Object Notation) 은 데이터 교환을 위한 경량화된 포맷으로, 객체와 배열 등의 데이터 구조를 표현한다.

 

객체는 중괄호 {} 로 감싸진 key-value 쌍들의 집합이며, 각각의 key는 문자열이고, value는 JSON에서 허용되는 모든 데이터 타입으로 표현될 수 있다. 

배열은 대괄호 [] 로 감싸진 값들의 리스트이며, 역시 값은 JSON에서 허용되는 모든 데이터 타입으로 표현될 수 있다.

 

JSON에서 객체의 속성들과 배열의 원소들은 콤마 , 로 구문하며 배열과 객체는 함께 사용할 수 있다. 객체는 배열의 요소로 포함될 수 있는데, 이 경우, 객체는 배열의 요소가 된다. 또한, 객체 안에 배열이 포함될 수 있으며. 이 경우, 객체의 속성 값이 배열이 된다.

 

JSON 포맷에서 배열과 객체의 가장 큰 차이는 배열의 값은 순서가 있으므로 인덱스로 접근할 수 있어 순서가 중요한 반면, 객체는 key와 value 쌍으로 구성되어 key를 사용하여 접근하므로 순서가 중요하지 않다. 따라서, 객체 속성의 순서가 변경되더라도 JSON 파싱 결과는 동일하게 나온다.

 

예시.

{
  "name": "John",
  "age": 30,
  "city": "New York",
  "hobbies" : [
    "swimming", 
    "pingpong",
    "coding"
  ]
}

 

 

 

 

 

 

 

 

 

rapidjson 라이브러리 프로젝트에 추가하기

 

rapidjson은 C++로 JSON 파서 라이브러리이다. rapidjason은 nlohmann 라이브러리보다 인터페이스는 복잡하지만 JSON 객체의 순서를 유지한다는 장점이 있다.

 

아래 깃허브 레파지토리에서 코드를 다운받고 프로젝트에 libraries 폴더를 추가해 그 안에 넣어둔다.

 

https://github.com/Tencent/rapidjson/

 

GitHub - Tencent/rapidjson: A fast JSON parser/generator for C++ with both SAX/DOM style API

A fast JSON parser/generator for C++ with both SAX/DOM style API - GitHub - Tencent/rapidjson: A fast JSON parser/generator for C++ with both SAX/DOM style API

github.com

 

 

 

프로젝트 우클릭 - 속성 - VC++ 디렉터리 - 포함디렉터리에 추가

를 통해 include 폴더를 추가하면 된다.

 

rapidjason은 헤더파일만 사용하는 라이브러리이기 때문에 따로 dll 파일을 추가할 필요가 없다.

 

공식 튜토리얼 :

 

https://rapidjson.org/md_doc_tutorial.html

 

RapidJSON: Tutorial

This tutorial introduces the basics of the Document Object Model(DOM) API. As shown in Usage at a glance, JSON can be parsed into a DOM, and then the DOM can be queried and modified easily, and finally be converted back to JSON. Value & Document Each JSON

rapidjson.org

 

 

 

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/prettywriter.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace rapidjson;
using namespace std;

int main() {
    try {
        // JSON 파일을 읽기 모드로 열기
        ifstream ifs("example.json");
        if (!ifs.is_open()) {
            throw runtime_error("failed to open the file");
        }

        // 파일 내용을 문자열로 읽기
        string json((istreambuf_iterator<char>(ifs)), (istreambuf_iterator<char>()));

        // JSON 문자열 파싱
        Document doc;
        doc.Parse(json.c_str());

        // JSON 객체 편집
        Value& title = doc["title"];
        title.SetString("New Title");

        Value& email = doc["authors"][0]["email"];
        email.SetString("newemail@example.com");

        // JSON 문자열 생성
        StringBuffer buffer;
        PrettyWriter<StringBuffer> writer(buffer);
        doc.Accept(writer);

        // 파일에 JSON 문자열 쓰기
        ofstream ofs("new_example.json");
        ofs << buffer.GetString();

        ofs << endl;
    }
    catch (std::exception& e) {
        // 예외 처리
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

 

 

 

원본 example.json

{
  "title": "Example Title",
  "description": "This is an example JSON file.",
  "version": 1,
  "authors": [
    {
      "name": "John Doe",
      "email": "johndoe@example.com"
    },
    {
      "name": "Jane Doe",
      "email": "janedoe@example.com"
    }
  ]
}

 

 

 

 

출력물 new_example.json

{
    "title": "New Title",
    "description": "This is an example JSON file.",
    "version": 1,
    "authors": [
        {
            "name": "John Doe",
            "email": "newemail@example.com"
        },
        {
            "name": "Jane Doe",
            "email": "janedoe@example.com"
        }
    ]
}

'프로그래밍 > C++' 카테고리의 다른 글

C++ ] 예외처리 try-catch  (0) 2023.05.28
C++ ] filesystem 라이브러리  (0) 2023.05.28
C++ ] stream 상속관계  (0) 2023.05.14
C++ ] accumulate 함수 사용시 주의사항  (0) 2023.03.31
C++ ] 2차원 vector 사용법  (0) 2023.03.31