[MFC] C++에서 JSON 다루기 / rapid JSON / JSON / 예외처리
JSON
JSON이란 JavaScript Object Notation (JSON)은 Java script 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 데이터 포맷을 말하는 건데 공부하다 보면 { “name”: "Chris", “age”: "38" }이런 형식의 데이터를 봤었을 것이다. 키와 값 두개가 쌍으로 이루어진 데이터 포맷인데 내 생각에 비슷한 걸로는 파이썬의 딕셔너리 같은 느낌..? 현재 만드는 프로그램에서 JSON 데이터를 핸들링 하기 위해 외부 라이브러리를 사용하려고 하는데 JSON을 사용할 수 있게 하는 여러 가지 라이브러리 있지만 rapid JSON을 사용하기로 했다.
JSON 소스 코드
char* pszBuff;// rapidjson 관련 함수 사용시 char 형을 써야함
int strSize = WideCharToMultiByte(CP_ACP, 0, pBuffer, -1, NULL, 0, NULL, NULL); // wchar_t 변수 길이 구하기
pszBuff = new char[strSize];
memset(pszBuff, 0, sizeof(pszBuff));// char 변수 초기화
WideCharToMultiByte(CP_ACP, 0, pBuffer, -1, pszBuff, strSize, 0, 0); // wchar_t -> char 에 문자 넣어 주기
Document doc;
doc.Parse(pszBuff);
const char* findKey1 = "";
const char* findKey2 = "LOT";
if (doc.IsObject()) // 제이슨 형식인가
{
Value& v = doc;
if (v.HasMember(findKey1)) // 해당 멤버가 있는지 확인
m_static_Dblink = CA2T(v["DBLINK"].GetString(), CP_UTF8);
if (v.HasMember(findKey2))
m_static_Lot = CA2T(v["LOT"].GetString(), CP_UTF8);
}
rapid Json 예외처리
rapid Json은 자동으로 형변환을 해주지 않기 때문에 값이 int이면 Getint(), string 이면 GetString()으로 가지고 와야 한다. 그리고 없는 값에 접근하려고 하면 프로그램이 터져버리니... is@@()으로 값이 있는지 확인하고 접근하는 것이 좋을 듯하다. rapid JSON에서 예외처리를 위한 함수로는
상기 함수들이 기본인듯 하고 추가 궁금한 것은 https://rapidjson.org/index.html 에서 확인하면 될 것 같다
RapidJSON: Main Page
A fast JSON parser/generator for C++ with both SAX/DOM style API Tencent is pleased to support the open source community by making RapidJSON available. Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. Build status Introduction RapidJSON
rapidjson.org
데이터에서 비교하기
CString testStr = L"444";
if (doc.IsArray()) //First : [
{
for (SizeType i = 0; i < doc.Size(); i++)
{
Value& v = doc[i];
if (v.HasMember(findKey1)) // 해당 멤버가 있는지 확인
{
if (v[findKey1].IsString())
if(testStr == CA2T(v[findKey1].GetString(), CP_UTF8))
m_static_Dblink = CA2T(v["NUM"].GetString(), CP_UTF8);
//m_static_Lot = CA2T(v[findKey1].GetString(), CP_UTF8);
}
}
}
받은 데이터 : [{"DBLINK":"1234","NUM":"AAA"},{"DBLINK":"444", "NUM":"BBB"},{"DBLINK":"134","NUM":"CCC"},{"DBLINK":"7894", "NUM":"DDD"}]
받은 데이터에서 DBLINK의 값이 TestStr과 같다면 NUM의 번호를 읽어오는 코드이다.
확인결과 DBLINK = 444의 NUM = BBB가 잘 들어온 것을 확인 할 수 있음