picojsonを使ってみるという記事と同様にUnreal Engine4でパースしてみました。

{
    "name": "sacchy"
}

FString jsonData = "{\"name\":\"sacchy\"}";
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(jsonData);
FJsonSerializer::Deserialize(JsonReader, Data);
UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *jsonData);
UE_LOG(LogTemp, Warning, TEXT("nameは%sです"), *Data->GetStringField(TEXT("name")));



{
    "Human": {
        "name": "sacchy"
    }
}

FString jsonData = "{\"Human\":{\"name\":\"sacchy\"}}";
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(jsonData);FJsonSerializer::Deserialize(JsonReader, Data);
TSharedPtr<FJsonObject> object = Data->GetObjectField(TEXT("Human"));
UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *jsonData);
UE_LOG(LogTemp, Warning, TEXT("nameは%sです"), *object->GetStringField(TEXT("name")));



{
    "array": [
        {
            "Human": {
                "name": "sacchy"
            }
        }
    ]
}

FString jsonData = "{\"array\":[{\"Human\":{\"name\":\"sacchy\"}}]}";
TSharedRef<TJsonReader<TCHAR>> jsonreader= TJsonReaderFactory<TCHAR>::Create(jsonData);
FJsonSerializer::Deserialize(JsonReader, Data);
TArray<TSharedPtr<FJsonValue>> objectarray= Data->GetArrayField(TEXT("array"));
TSharedPtr<FJsonValue> value = objectArray[0];
TSharedPtr<FJsonObject> json = value->AsObject();
TSharedPtr<FJsonObject> object = json->GetObjectField(TEXT("Human"));
UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *jsonData);
UE_LOG(LogTemp, Warning, TEXT("nameは%sです"), *object->GetStringField(TEXT("name")));




[
    {
        "Human": {
            "name": "sacchy"
        }
    }
]

FString jsonData = "[{\"Human\":{\"name\":\"sacchy\"}}]";
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(jsonData);
TArray<TSharedPtr<FJsonValue>> objectArray;
FJsonSerializer::Deserialize(JsonReader, objectArray);
TSharedPtr<FJsonValue> value = objectArray[0];
TSharedPtr<FJsonObject> json = value->AsObject();
TSharedPtr<FJsonObject> object = json->GetObjectField(TEXT("Human"));
UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *jsonData);
UE_LOG(LogTemp, Warning, TEXT("nameは%sです"), *object->GetStringField(TEXT("name")));



以上です。毎回、配列に名前がないデータ形式にハマってしまいます。とりあえずこれでなんとかなりそうです。picojsonの記事と同様におまけでGoogle App Scriptを使ってJsonデータを取得した時のBluePrintを貼っておきます。どうも、「Post」だとダメなようでした。Json QueryPluginを利用しています。




ちなみに「Get Data関数」はJson Query Pluginのソースを改造しています。SQLiteを使う予定なのでこの関数を使うことはなさそうですが、検証という意味で作ってみました。必要のないところは記述してません。

private:
    enum class EPieceType
    {
        Num = 0,
        Table,
    };
    
    struct FPiece
    {
        FString Num;
        FString Table;


        FPiece(FString InNum, FString InTable) :
        Num(InNum),
        Table(InTable)
        {
        }
    };
    
    TMap<int32, FPiece> gameDataMap;
public:
    UFUNCTION(BlueprintPure, meta = (FriendlyName = "Get Data", HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"), Category = "JSON")
    FString getDataByIdx(int32 idx);

void UJsonFieldData::OnReady(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
   // 省略
   TArray<TSharedPtr<FJsonValue>> objArray = Data->GetArrayField(TEXT("master"));
   
    for (int32 i = 0; i < objArray.Num(); i++)
    {
        TArray<TSharedPtr<FJsonValue>> objArray2 = objArray[i]->AsArray();
        TSharedPtr<FJsonValue> value = objArray2[0];
        TSharedPtr<FJsonObject> json = value->AsObject();
        
        FString numStr = json->GetStringField(TEXT("num"));
        FString tableStr = json->GetStringField(TEXT("table"));
        
        FPiece NewPiece(numStr, tableStr);
        gameDataMap.Add(i, NewPiece);
    }
   
   // Assign the request content
   Content = Response->GetContentAsString();
   
   // Broadcast the result event
   OnGetResult.Broadcast();
}

FString UJsonFieldData::getDataByIdx(int32 idx)
{
    FPiece Piece = gameDataMap[idx];
    UE_LOG(LogTemp, Warning, TEXT("テーブルの名前は%s"), *Piece.Table);
    FString resStr = FString::Printf(TEXT("テーブルの名前は%s"), *Piece.Table);
    return resStr;
}


これでテーブルの名前がうまくログに表示されました。GASから返される値によってパース部分を変更してみてください。今回はstd::mapと同様に使えるTMapもついでに学べて良かったです。c++なのにc++じゃないUE4独特な書き方に慣れるのはまだまだ先のようです。