JsonCpp 라이브러리 사용하기
21 Jan 2019 | C++C++ JsonCpp 사용하기
JsonCpp의 repository는 여기입니다.
Amalgamated source
JsonCpp는 Amalgamated source이라는 기능을 제공합니다. 이 기능은 간단한 간단한 python 스크립트를 이용해서 몇 개의 헤더 파일과 소스 파일을 만들어서 다른 프로젝트에서 쉽게 사용할 수 있게 해주는 기능입니다. JsonCpp 소스 파일 전체를 참조하지 않고 몇 개의 파일 추가만으로 기능을 사용할 수 있기 때문에 사용성이 많이 간편해집니다.
보다 자세한 내용은 여기에서 확인할 수 있습니다.
명령어는 다음과 같습니다.
python amalgamate.py
이 명령어를 수행하면 해당 디렉토리에 dist라는 디렉토리가 생성되며 그 안에
.
├── json
│ ├── json-forwards.h
│ └── json.h
└── jsoncpp.cpp
구조로 파일들이 생성됩니다. 이 파일들을 복사해서 사용하려는 프로젝트에 넣고 사용하면 됩니다.
CMakeLists.txt
사용하려는 프로젝트의 CMakeLists.txt 사용 예제는 다음과 같습니다.
cmake_minimum_required(VERSION 3.15) project(JsonExample) set(CMAKE_CXX_STANDARD 14) add_executable(JsonExample main.cpp jsonCpp/jsoncpp.cpp jsonCpp/json/json.h jsonCpp/json/json-forwards.h)
Json 파싱 예제
#include <iostream>
#include <fstream>
#include "jsonCpp/json/json.h"
using namespace std;
int main() {
Json::Value root;
Json::CharReaderBuilder reader;
ifstream is("MoveToPoint.json", ifstream::binary);
auto bret = Json::parseFromStream(reader, is, &root, &errorMessage);
if (bret == false) {
cout << "Error to parse JSON file !!!" << endl;
}
cout << "root: " << root << endl;
cout << "root.size(): " << root.size() << endl;
cout << "name: " << root["name"] << endl;
auto nodeList = root["nodeList"];
cout << "nodeList.size(): " << nodeList.size() << endl;
int left = 0;
for(auto n : nodeList) {
cout<<"- node: " << n["className"] << endl;
cout<<"- id: " << n["id"] << endl;
left = n["left"].asInt();
cout<<"- left: " << left << endl;
cout<<"- paramList: " << n["paramList"] << endl;
}
return 0;
}
Json 생성 예제
Json::Value compInfo;
compInfo["category"] = it->second;
compInfo["className"] = classInfo.name();
compInfo["type"] = getType();
auto seq = 0;
for (auto it = iter.begin(); it != iter.end(); it++) {
Json::Value paramInfo;
paramInfo["seq"] = seq++;
paramInfo["type"] = getTypeFromKind(it->second->kind());
paramInfo["name"] = it->first;
compInfo["paramList"].append(paramInfo);
}
root["componentList"].append(compInfo);
auto result = root.toStyledString();
}