#include <iostream>
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/prettywriter.h>
#include <rapidjson/stringbuffer.h>
#include <fstream>
#include <filesystem>
using namespace std;
int main(int argc, char* argv)
{
const char* jsonStr = R"({"project" : "rapidjson" , "star" : 10})";
// UTF16<wchar_t> 는 템플릿 클래스 타입 이다. 클래스명 UTF16 이고 , 템플릿으로 입력한 타입을 기준으로 인코딩/디코딩 하는 함수를 정적함수들을 정의한다고 보면 된다.
// rapidjson::GenericDocument<rapidjson::UTF8<>, MeoryPoolAllocator<>> jsonRootObj; // UTF-8 인코딩의 경우
// rapidjson::GenericDocument<rapidjson::UTF16<wchar_t> jsonRootObj; // UTF-16 인코딩의 경우
rapidjson::Document jsonRootObj; // json 파일 루트 객체 생성
jsonRootObj.Parse(jsonStr); // JSON 데이터 객체화
cout << jsonRootObj["project"].GetString() << endl;
cout << jsonRootObj["star"].GetInt() << endl;
auto& alloc = jsonRootObj.GetAllocator();
// 멤버 추가 ( 문자열 )
jsonRootObj.AddMember("language", "C++", alloc);
// 멤버추가 ( 정수 )
jsonRootObj.AddMember("score", 20, alloc);
// 멤버추가 객체
rapidjson::Value jsonSubObj_obj(rapidjson::kObjectType);
jsonSubObj_obj.AddMember("x", 10, alloc);
jsonSubObj_obj.AddMember("y", 20, alloc);
jsonRootObj.AddMember("objectTypeMember", jsonSubObj_obj, alloc);
// 멤버추가 배열
rapidjson::Value jsonSubObj_arr(rapidjson::kArrayType);
for (int i = 0; i < 5; ++i)
{
// 배열에 추가할 객체 선언
rapidjson::Value jsonSubObj_arrElem(rapidjson::kObjectType);
jsonSubObj_arrElem.AddMember("ObjectNumber", i, alloc);
// 배열에 객체 추가
jsonSubObj_arr.PushBack(jsonSubObj_arrElem, alloc);
}
jsonRootObj.AddMember("ObjectArr", jsonSubObj_arr, alloc);
// JSON 문자열로 반환
// rapidjson::GenericStringBuffer<rapidjson::UTF16<wchar_t>> buffer // UTF-16
rapidjson::StringBuffer buffer;
// rapidjson::Writer<GenericStringBuffer<rapidjson::UTF16<wchar_t>>, rapidjson::UTF16<wchar_t>> writer(buffer); // json writer (UTF-16)
// rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); // json writer (UTF-8)
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer); // 예쁘게 json 으로 쓰기
writer.SetIndent(' ', 4); // 4칸 들여쓰기 ( 기본은 4칸, 변경가능 )
jsonRootObj.Accept(writer); // visitor 패턴. jsonDoc 에 writer 를 들여서, 내용을 writer 에게 출력가능한 형태로 바꿔달라고 해!
// 파일로 저장
std::ofstream outputFile(L"./metaData_pretty.json");
outputFile << buffer.GetString();
outputFile.close();
// 파일로 부터 읽기
string LoadedJsonStr;
// json 파일 읽기
std::ifstream inputFile(L"./metaData_pretty.json");
if (inputFile.is_open())
{
string line;
while (std::getline(inputFile, line))
{
LoadedJsonStr += line;
}
}
else {
cout << "no exist file." << endl;
}
rapidjson::Document jsonRootObj2;
jsonRootObj2.Parse(LoadedJsonStr.c_str());
if (!jsonRootObj2.HasParseError())
{
cout << jsonRootObj2["project"].GetString() << endl;
}
else {
cout << "invalid json obj" << endl;
}
return 0;
}