본문 바로가기
개발/Windows

[C++/WinRT] 윈도우C++프로젝트에서 json파싱하기

by lucidmaj7 2024. 11. 23.
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

 

JsonObject Class (Windows.Data.Json) - Windows apps

Represents a JSON object containing a collection of name and JsonValue pairs. JsonObject is an activatable class that implements JsonValue and the IMap<String,IJsonValue> interface such that its name/value pairs can be manipulated like a dictionary. When t

learn.microsoft.com

당장 예제를 보자.

우선 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
반응형

댓글