トルネード

毛利のメモ書き

UWP VC++ JSON文字列データ解析方法

Visual Studio 2017 UWP VC++JsonObjectを使ってJSON文字列解析

void cpp_uwp::json_test::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    using namespace Windows::Data::Json;
    std::function<void(JsonObject^)> hhge{ [this](JsonObject^ json1) {
        std::wstringstream lout;
        std::function<void(IJsonValue^, Platform::String^)> foo{
        [this, &foo, &lout](IJsonValue^ ijv1, Platform::String^ key_name) {
            int i;
            Platform::String^ s;
            switch (ijv1->ValueType)
            {
            case JsonValueType::Boolean:
                lout << key_name->Data() << "," << (ijv1->GetBoolean() ? L"true" : L"false") << std::endl;
                break;
            case JsonValueType::Array:
                for (int i1 = 0; i1 < ijv1->GetArray()->Size; ++i1)
                {
                    foo(ijv1->GetArray()->GetAt(i1), key_name);
                }
                break;
            case JsonValueType::Number:
                i = ijv1->GetNumber();
                lout << key_name->Data() << "," << i << std::endl;
                break;
            case JsonValueType::String:
                s = ijv1->GetString();
                lout << key_name->Data() << "," << s->Data() << std::endl;
                break;
            case JsonValueType::Object:
                bool bNext{true};
                auto JIt1 = ((JsonValue^)ijv1)->GetObject()->First();
                while (bNext)
                {
                    foo(JIt1->Current->Value, JIt1->Current->Key);
                    bNext = JIt1->MoveNext();
                }
                break;
            }
        } };
        foo(json1, nullptr);
        std::wstring outp{lout.str()};
        Edit1->Text = ref new Platform::String(outp.c_str());
    } };
    hhge(JsonObject::Parse(Edit1->Text));//文字列JSONの解析
}

f:id:mojeld:20180828143302g:plain

gist