Nlohmann Json 라이브러리 샘플
11 Jan 2022 | C++nlohmann json
여기에서 코드 확인할 수 있으며, 샘플이나 설명도 자세하게 되어 있습니다.
그 외에도 JsonCpp나 RapidJSON 등의
라이브러리들도 사용해보았지만, 사용 편의성이 가장 우수한게 nlohmann json이었던 것 같습니다.
nlohmann json의 장점은 대략 다음과 같습니다.
- Modern C++ 연산자를 지원. 마치 Python에서의 JSON 사용과 비슷한 느낌을 제공
- 쉬운 사용. 헤더 파일 1개(
nlohmann/json.hpp)만 include 해서 사용 가능 - 높은 Coverage의 검증 완료
예제 파일
#include <iostream>
#include <string>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
const auto JSON_INDENT = 2;
const std::string strJson = R"(
{
"id" : 123456,
"res" : 111.222,
"name" : "Example Json",
"desc" : "Hello, SnowDeer",
"data" : [
{
"id" : 101,
"name" : "snowdeer"
},
{
"id" : 202,
"name" : "ice-rabbit"
}
],
"info" : {
"notebook" : "macbook m1 pro",
"address" : "Seoul"
}
}
)";
void createJsonObjectTest() {
std::cout << "### Create JSON Object ###" << std::endl;
json obj;
obj["id"] = 0;
obj["data"]["name"] = "snowdeer";
obj["data"]["age"] = 45;
obj["data"]["address"] = "Seoul";
std::cout << obj.dump(JSON_INDENT) << std::endl;
}
void createJsonArrayTest() {
std::cout << "### Create JSON Array ###" << std::endl;
json objs;
objs.push_back("snowdeer");
objs.push_back("ice-rabbit");
objs.push_back("fire-bat");
std::cout << objs.dump(JSON_INDENT) << std::endl;
}
void createMixedJsonObjectTest() {
std::cout << "### Create Mixed JSON Object ###" << std::endl;
json obj1 = {{"id", 1},
{"name", "snowdeer"},
{"age", 45}};
json obj2 = {{"id", 2},
{"name", "ice-rabbit"},
{"age", 32}};
json obj3 = {{"id", 3},
{"name", "fire-bat"},
{"age", 28}};
json objs;
objs.push_back(obj1);
objs.push_back(obj2);
objs.push_back(obj3);
std::cout << objs.dump(JSON_INDENT) << std::endl;
}
void parseJsonTest() {
std::cout << "### parseJson Test ###" << std::endl;
auto j = json::parse(strJson);
std::cout << j.dump(JSON_INDENT) << std::endl;
std::cout << j["data"].dump(JSON_INDENT) << std::endl;
std::cout << j["datxxx"].dump(JSON_INDENT) << std::endl; // 잘못된 Key에 대해서는 null
// std::cout << j["data"]["name"].dump(JSON_INDENT) << std::endl; // 배열을 이런 식으로 접근하면 Exception
std::cout << j["data"][0]["name"].dump(JSON_INDENT) << std::endl;
}
std::string getTypeOfValue(json value) {
if (value.is_array()) return "array";
if (value.is_boolean()) return "boolean";
if (value.is_null()) return "null";
if (value.is_number_integer()) return "integer";
if (value.is_number_float()) return "double";
if (value.is_string()) return "string";
if (value.is_object()) return "object";
return "Unknown";
}
void getKeyValueListTest() {
std::cout << "### Key Value Test ###" << std::endl << std::endl;;
auto j = json::parse(strJson);
for (json::iterator it = j.begin(); it != j.end(); ++it) {
std::cout << "Key : \"" << it.key() << "\"" << std::endl;
std::cout << "Type : " << getTypeOfValue(it.value()) << std::endl;
std::cout << "Value : " << it.value() << std::endl;
std::cout << std::endl;
}
}
void recursive(json j, int space) {
std::string indent = "";
for (auto i = 0; i < space; i++) {
indent = indent + " ";
}
for (json::iterator it = j.begin(); it != j.end(); ++it) {
std::cout << indent << "Key : \"" << it.key() << "\"" << std::endl;
if (it.value().is_array()) {
std::cout << indent << "[" << std::endl;
for (auto item : it.value()) {
recursive(item, space + 2);
}
std::cout << indent << "]" << std::endl;
}
if (it.value().is_object()) {
std::cout << indent << "{" << std::endl;
recursive(j[it.key()], space + 2);
std::cout << indent << "}" << std::endl;
}
}
}
void recursiveParseJsonTest() {
std::cout << "### Recursive parse Json Test ###" << std::endl;
auto j = json::parse(strJson);
recursive(j, 0);
}
int main() {
std::cout << "Hello, World!" << std::endl;
// createJsonObjectTest();
// createJsonArrayTest();
// createMixedJsonObjectTest();
// parseJsonTest();
// getKeyValueListTest();
recursiveParseJsonTest();
return 0;
}