메모내용

JSON

RapidJSON

                
git clone https://github.com/Tencent/rapidjson.git
                
            
                
#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;

}
                
            

예시2

				

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/allocators.h"
#include "rapidjson/encodings.h"
#include "rapidjson/prettywriter.h";

/** 세계관에 대한 간단한 설명을 위한 구조체 */
struct WorldMetadata
{
	// 세계관 식별자
	std::string ID;  
	
	// 세계관 명
	std::string Name; 

	// 세계관 소속 프로젝트 명 ( 부제 )
	std::string ProjectName;

	// 세계관 설명
	std::string Description;		
	
	// 세계관 카테고리
	std::string Category;			
	
	// 세계관 관련 태그
	std::vector Tag;	

};

bool WorldDataManager::CreateNewWorld(WorldMetadata newWorldMetaData)
{
	

	// root obj 선언
	rapidjson::Document jsonRootObj;
	jsonRootObj.SetObject();

	// 데이터 관리용 Allocator 선언
	auto& alloc = jsonRootObj.GetAllocator();

	jsonRootObj.AddMember("ID", rapidjson::Value(newWorldMetaData.ID.c_str(), alloc), alloc);
	jsonRootObj.AddMember("Name", rapidjson::Value(newWorldMetaData.Name.c_str(), alloc), alloc);
	jsonRootObj.AddMember("ProjectName", rapidjson::Value(newWorldMetaData.ProjectName.c_str(), alloc), alloc);
	jsonRootObj.AddMember("Description", rapidjson::Value(newWorldMetaData.Description.c_str(), alloc), alloc);
	jsonRootObj.AddMember("Category", rapidjson::Value(newWorldMetaData.Category.c_str(), alloc), alloc);
	jsonRootObj.AddMember("testing", "안녕하세요", alloc);

	rapidjson::Value worldTagArr(rapidjson::kArrayType);

	for (int i = 0; i < newWorldMetaData.Tag.size(); ++i)
	{
		worldTagArr.PushBack(rapidjson::Value(newWorldMetaData.Tag[i].c_str(), alloc), alloc);
	}

	jsonRootObj.AddMember("Tag", worldTagArr, alloc);

	rapidjson::StringBuffer buffer;
	rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);

	writer.SetIndent(' ', 4);
	jsonRootObj.Accept(writer);	// visitor 패턴, writer 를 들여보내서 pretty 한 형태로 데이터를 적어달라고 하기

	std::ofstream outFile("./worldMetadata.json");
	outFile << buffer.GetString();

	outFile.close();

	::OutputDebugStringA("Save Success worldMetadata.json");

	return true;

}