-
[MFC] C++에서 JSON 다루기 / rapid JSON / JSON / 예외처리정보공유/공부 2023. 12. 27. 10:04
JSON
JSON이란 JavaScript Object Notation (JSON)은 Java script 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 데이터 포맷을 말하는 건데 공부하다 보면 { “name”: "Chris", “age”: "38" }이런 형식의 데이터를 봤었을 것이다. 키와 값 두개가 쌍으로 이루어진 데이터 포맷인데 내 생각에 비슷한 걸로는 파이썬의 딕셔너리 같은 느낌..? 현재 만드는 프로그램에서 JSON 데이터를 핸들링 하기 위해 외부 라이브러리를 사용하려고 하는데 JSON을 사용할 수 있게 하는 여러 가지 라이브러리 있지만 rapid JSON을 사용하기로 했다.
include rapidjson 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에서 예외처리를 위한 함수로는
•.IsObject() : object인지 확인•.HasMember() : 데이터 안에 해당(가로안에)키 있는지 확인•.IsString() : string 타입인지 확인•.IsBool() : Bool 타입인지 확인•.IsNull() : NULL 타입인지 확인•.IsInt() : int 타입인지 확인상기 함수들이 기본인듯 하고 추가 궁금한 것은 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가 잘 들어온 것을 확인 할 수 있음
'정보공유 > 공부' 카테고리의 다른 글
[MFC] What is Window Message Number??/ 윈도우 메세지 넘버 확인 / PeekMessage() / OnMessagePending() (1) 2024.01.10 [MFC] PC <-> PC 소켓 통신 TCP/IP / 이더넷 연결 / 무선 연결 / IP 통신 / JSON / rapid JSON (0) 2024.01.02 [MFC] 상단바 없애기 (0) 2023.12.18 [MFC] 조명 컨트롤러 연결 (Modbus 형식) + RS485 케이블을 이용한 컨트롤 (0) 2023.12.13 [MFC] Visual Studio 2022 새 솔루션 만들기 SDI, 메뉴바 제거, 도구바 제거, 창 속성 변경 (0) 2023.12.05