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/
프로젝트 우클릭 - 속성 - VC++ 디렉터리 - 포함디렉터리에 추가
를 통해 include 폴더를 추가하면 된다.
rapidjason은 헤더파일만 사용하는 라이브러리이기 때문에 따로 dll 파일을 추가할 필요가 없다.
공식 튜토리얼 :
https://rapidjson.org/md_doc_tutorial.html
#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 |