C++ Nested JSON in Unreal Engine 4

后端 未结 2 612
忘了有多久
忘了有多久 2021-02-09 12:08

I have a JSON object that I am getting from my server that looks something like this:

{
    "state":"1",
    "player1": {
        &q         


        
相关标签:
2条回答
  • 2021-02-09 12:48
        for (auto currJsonValue = JsonObject->Values.CreateConstIterator(); currJsonValue; ++currJsonValue)
        {
            // Get the key name
            const FString Name = (*currJsonValue).Key;
    
            // Get the value as a FJsonValue object
            TSharedPtr< FJsonValue > Value = (*currJsonValue).Value;
    
            TSharedPtr<FJsonObject> JsonObjectIn = Value->AsObject();
        }
    

    The Json Object nested can be accessed by GetObjectField or the code I posted.

    0 讨论(0)
  • 2021-02-09 12:49

    Don't know if you got it sorted out, but I found a pretty nasty function that works for nested objects and, also, for arrays altogether. And it gives you a USTRUCT, so you don't have to use the functions that get values by Keys (I don't like them since they're very error prone). Instead, you'll have type safety!

    FJsonObjectConverter::JsonObjectStringToUStruct

    Here are the docs and another question answered on UE4 AnswerHub

    Basically, you create the target USTRUCT (or USTRUCTs for nested JSONs), mark all properties with UPROPERTY, so Unreal knows their names, and use this function. It will copy the values by matchmaking them. It copies even the arrays! =D

    Example

    I'll call the JSON FString to be deserialized Json and it's structure is like the one below. It contains a nested object and an array, to make things interesting.

    {
        "nested" : {
            "id" : "654asdf",
            "name" : "The Name"
        },
        "foo" : "foobar",
        "bar_arr" : [
            { "barfoo" : "asdf" },
            { "barfoo" : "qwer" }
        ]
    }
    

    Before converting, we need to create the USTRUCTs from inside out (so we can reference inner on the outer). Remember to always use F for struct names.

    USTRUCT()
    struct FNested
    {
        GENERATED_USTRUCT_BODY()
    
        UPROPERTY()
        FString id;
    
        UPROPERTY()
        FString name;
    };
    
    USTRUCT()
    struct FBar
    {
        GENERATED_USTRUCT_BODY()
    
        UPROPERTY()
        FString barfoo;
    };
    
    USTRUCT()
    struct FJsonData
    {
        GENERATED_USTRUCT_BODY()
    
        UPROPERTY()
        FNested nested;
    
        UPROPERTY()
        FString foo;
    
        UPROPERTY()
        TArray<FBar> bar_arr;
    };
    

    The conversion will go like this:

    FJsonData JsonData;
    FJsonObjectConverter::JsonObjectStringToUStruct<FJsonData>(
        Json,
        &JsonData,
        0, 0);
    

    Now, you are able to access all the properties as in standard C++ structs. Eg., to access one of the barfoos:

    FString barfoo0 = JsonData.bar_arr[0].barfoo;
    

    I have not tested it with int and float in the JSON, but since it copies even arrays, I believe that would work also.

    0 讨论(0)
提交回复
热议问题