Boost에서 UTF-8 JSON 파싱

아주 간혹 일부 사이트에서 UTF-8로 된 JSON을 사용하는 경우가 있다.

우선 다운로드 받은 JSON을 UTF-8에서 Unicode으로 변환해야 합니다.

#include <boost/locale.hpp>
std::wstring jsonString = boost::locale::conv::to_utf<wchar_t>(readBuffer, "UTF-8");

readBuffer은 std::string으로 구성된 데이터입니다.

boost::locale::conv::to_utf 함수 하나면 UTF-8을 Unicode(std::wstring)으로 변환할 수 있습니다.

자세한 내용은 아래 boost 문서를 참고하시길 바랍니다.

https://www.boost.org/doc/libs/1_53_0/libs/locale/doc/html/group__codepage.html

 

유니코드는 boost::property_tree::ptree 대신 boost::property_tree::wptree 클래스를 사용합니다.

boost::property_tree::read_json 함수를 통해 stream이나 JSON 파일 경로를 인자로 줘서 JSON 데이터를 파싱할 수 있습니다.

 

파일 경로를 지정하지 않고 메모리 상의 JSON을 파싱하기 위해 std::wstring을 std::wstringstream에 입력합니다.

std::wstringstream ssJson;
ssJson.str(jsonString);

마지막으로 boost::property_tree::read_json 함수를 호출할 차례입니다.

boost::property_tree::wptree json;
boost::property_tree::read_json(ssJson, json);

JSON 문법에 문제가 있을 경우 Exception이 발생합니다.

try
{
 // ...
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << "\n";
}

e.what() 을 통해 JSON 에러 내용을 확인할 수 있습니다.

 

 

아래는 전체 코드입니다.

 

감사합니다.

 

#include <boost/locale.hpp>

void parseJson(std::string readBuffer)
{
try
{
std::wstring jsonString = boost::locale::conv::to_utf<wchar_t>(readBuffer, "UTF-8");
std::wstringstream ssJson;
ssJson.str(jsonString);
boost::property_tree::wptree json;
boost::property_tree::read_json(ssJson, json);

//json 변수를 통해 원하는 작동 구현
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << "\n";
}
}