728x90
반응형
C++로 작성된 MFC, Win32프로젝트에서 json을 다룰 때 고민이 많다. 나 같은 경우 보통은 jsoncpp를 활용해서 json을 파싱한다.
하지만 precompiler를 설정하지 못해 빌드속도가 늦어지거나 jsoncpp를 사용하는 다른 라이브러리들과 심볼 충돌 등의 문제가 있을 수 있는 문제가 있다.
요새 윈도우 프로젝트를 하면서 cpp winrt를 유심히 보고 있다 async와 같은 스레드 처리를 쉽게 할 수 있기도 하고 모던한 Windows앱을 만드는데 도움이 되기 때문이다. 이제 win32만으로는..
꽤 편리하게 사용될 수 있는 winrt클래스 중 하나인 JsonObject를 이용해 서드파티 라이브러리 없이 cpp winrt로 json을 파싱할 수 있다.
https://learn.microsoft.com/en-us/uwp/api/windows.data.json.jsonobject?view=winrt-26100
당장 예제를 보자.
우선 nuget패키지로 cpp winrt를 추가해준다.
전체 예제 코드는 다음과 같다.
#include <Windows.h>
#include <winrt/base.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Data.Json.h>
#include <winrt/Windows.Foundation.h>
#include <iostream>
using namespace winrt;
using namespace Windows::Data::Json;
using namespace Windows::Foundation;
int main() {
// WinRT 초기화
init_apartment();
try {
// 1. JSON 객체 생성
JsonObject jsonObject;
jsonObject.Insert(L"name", JsonValue::CreateStringValue(L"John Doe"));
jsonObject.Insert(L"age", JsonValue::CreateNumberValue(30));
jsonObject.Insert(L"isDeveloper", JsonValue::CreateBooleanValue(true));
// 2. JSON 문자열로 출력
hstring jsonString = jsonObject.ToString();
std::wcout << L"JSON string: " << jsonString.c_str() << std::endl;
// 3. JSON 문자열 파싱
JsonObject parsedObject = JsonObject::Parse(jsonString);
// 4. 값 읽기
hstring name = parsedObject.GetNamedString(L"name");
double age = parsedObject.GetNamedNumber(L"age");
bool isDeveloper = parsedObject.GetNamedBoolean(L"isDeveloper");
std::wcout << L"name: " << name.c_str() << std::endl;
std::wcout << L"age: " << age << std::endl;
std::wcout << L"devloper : " << (isDeveloper ? L"yes" : L"no") << std::endl;
}
catch (hresult_error const& ex) {
std::wcerr << L"error: " << ex.message().c_str() << std::endl;
}
return 0;
}
사용법은 매우 간단하다.
자세한건 msdn을 참고하여 사용하면 좋을 듯하다.
주의할 점은 winrt JsonObject는 UTF-16 Wide Character기준으로 동작하므로 서버에서 받은 보통 json은 utf-8 멀티바이트로 되어있기 때문에 변환하여 사용해야 하고, 서버로 다시 보내거나 파일로 쓸때는 다시 utf8로 변환시켜줘야한다.
728x90
반응형
'개발 > Windows' 카테고리의 다른 글
[WTL] Visual studio 2022에서 WTL Wizard 설치하기 (1) | 2024.08.26 |
---|---|
[WinUI3/c++] 창 사이즈 변경하기 (0) | 2024.08.17 |
Openssl Windows용 빌드 하기(Openssl 3.0) + jom 병렬 빌드하기 (0) | 2024.07.20 |
[Winui3] Unpackaged 프로젝트로 설정하기 (0) | 2024.05.26 |
[WinUI3] WinUI3 써먹을 수 있을까? (0) | 2024.05.26 |
댓글