개발 라이브러리 & 툴

C++ boost json용 라이브러리(boost.json)

하늘흐늘 2021. 10. 15. 17:53
반응형

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다.
1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. 
  
boost.json을 사용하는 Hello World입니다.

#include <boost/json.hpp>
#include <iostream>
#include <string>


using namespace boost;
using namespace std;

int main(int argc, char* argv[])
{
	json::value jv = {
		{ "Hello", "World" }
	};

	std::string str = json::serialize(jv);

	cout << str << endl;

	return 0;
}

참고로 기존 property_tree를 이용한 Hello World와 비교하여 보면 코드가 좀 더 JSON형태로 보입니다.
사용법은 Quick Look을 읽고 따라해보면 금방 익히실 수 있을 듯 보입니다.

전반적으로 테스트 해보니 아래와 같은 장점이 있는 듯 했습니다.
  
1. 코드가 좀 더 JSON형태로 보입니다. 예로 아래와 같은 코드가 가능합니다. 

value jv = {
    { "pi", 3.141 },
    { "happy", true },
    { "name", "Boost" },
    { "nothing", nullptr },
    { "answer", {
        { "everything", 42 } } },
    {"list", {1, 0, 2}},
    {"object", {
        { "currency", "USD" },
        { "value", 42.99 }
            } }
    };

  
2. 객체와 JSON간의 변환이 아래와 같은 형태로 짧고 간결하게 가능합니다.

struct customer
{
	int id;
	std::string name;
	bool current;
};

void tag_invoke(json::value_from_tag, json::value& jv, customer const& c)
{
	jv = {
		{ "id" , c.id },
		{ "name", c.name },
		{ "current", c.current }
	};
}

customer tag_invoke(json::value_to_tag< customer >, json::value const& jv)
{
	json::object const& obj = jv.as_object();
	return customer{
		json::value_to<int>(obj.at("id")),
		json::value_to<std::string>(obj.at("name")),
		json::value_to<bool>(obj.at("current"))
	};
}

json::value jv = {
	{ "id", 3 },
	{ "name", "json" },
	{ "current", true }
};

customer c(json::value_to<customer>(jv));

json::value jv2 = json::value_from(c);

단점으로는 관련 클래스를 사용할 때는 json 네임스페이스를 붙여서 사용해야 합니다. json 네임스페이스를 붙이지 않을 경우 std와 클래스 이름 충돌이 좀 많이 일어납니다.

반응형