picojsonを使ってみるという記事と同様にUnreal Engine4でパースしてみました。
以上です。毎回、配列に名前がないデータ形式にハマってしまいます。とりあえずこれでなんとかなりそうです。picojsonの記事と同様におまけでGoogle App Scriptを使ってJsonデータを取得した時のBluePrintを貼っておきます。どうも、「Post」だとダメなようでした。Json QueryPluginを利用しています。
ちなみに「Get Data関数」はJson Query Pluginのソースを改造しています。SQLiteを使う予定なのでこの関数を使うことはなさそうですが、検証という意味で作ってみました。必要のないところは記述してません。
これでテーブルの名前がうまくログに表示されました。GASから返される値によってパース部分を変更してみてください。今回はstd::mapと同様に使えるTMapもついでに学べて良かったです。c++なのにc++じゃないUE4独特な書き方に慣れるのはまだまだ先のようです。
{ "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独特な書き方に慣れるのはまだまだ先のようです。