-
-
Save drawcode/1b6014cda14c945b8a9d186eb026fcc8 to your computer and use it in GitHub Desktop.
[UE4(Unreal Engine 4)] Example for parsing json and creating struct instance from parsed json.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"AwesomeStructs": | |
[ | |
{ | |
"AwesomeVector": [10,0,0], | |
"AwesomeBoolean": true, | |
"AwesomeFloat": 10.5, | |
"AwesomeInteger": 20, | |
"AwesomeRotator": [10,10,5], | |
}, | |
{ | |
"AwesomeVector": [10,0,0], | |
"AwesomeBoolean": true, | |
"AwesomeFloat": 10.5, | |
"AwesomeInteger": 20, | |
"AwesomeRotator": [10,10,5], | |
}, | |
{ | |
"AwesomeVector": [10,0,0], | |
"AwesomeBoolean": true, | |
"AwesomeFloat": 10.5, | |
"AwesomeInteger": 20, | |
"AwesomeRotator": [10,10,5], | |
}, | |
{ | |
"AwesomeVector": [10,0,0], | |
"AwesomeBoolean": true, | |
"AwesomeFloat": 10.5, | |
"AwesomeInteger": 20, | |
"AwesomeRotator": [10,10,5], | |
}, | |
{ | |
"AwesomeVector": [10,0,0], | |
"AwesomeBoolean": true, | |
"AwesomeFloat": 10.5, | |
"AwesomeInteger": 20, | |
"AwesomeRotator": [10,10,5], | |
}, | |
] | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "ProcedualSpline.h" | |
#include "AwesomeStruct.h" | |
FAwesomeStruct FAwesomeStruct::BuildAwesomeStruct( | |
FVector AwesomeVector, | |
bool AwesomeBoolean, | |
float AwesomeFloat, | |
int32 AwesomeInteger, | |
FRotator AwesomeRotator | |
) | |
{ | |
FAwesomeStruct AwesomeStruct; | |
AwesomeStruct.AwesomeVector = AwesomeVector; | |
AwesomeStruct.AwesomeBoolean = AwesomeBoolean; | |
AwesomeStruct.AwesomeFloat = AwesomeFloat; | |
AwesomeStruct.AwesomeInteger = AwesomeInteger; | |
AwesomeStruct.AwesomeRotator = AwesomeRotator; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Fill out your copyright notice in the Description page of Project Settings. | |
#pragma once | |
#include "AwesomeStruct.generated.h" | |
USTRUCT(BlueprintType) | |
struct FAwesomeStruct | |
{ | |
GENERATED_BODY() | |
public: | |
UPROPERTY(EditAnyWhere, BluePrintReadWrite, Category = "Struct") | |
FVector AwesomeVector; | |
UPROPERTY(EditAnyWhere, BluePrintReadWrite, Category = "Struct") | |
bool AwesomeBoolean; | |
UPROPERTY(EditAnyWhere, BluePrintReadWrite, Category = "Struct") | |
float AwesomeFloat; | |
UPROPERTY(EditAnyWhere, BluePrintReadWrite, Category = "Struct") | |
int32 AwesomeInteger; | |
UPROPERTY(EditAnyWhere, BluePrintReadWrite, Category = "Struct") | |
FRotator AwesomeRotator; | |
public: | |
static FAwesomeStruct BuildAwesomeStruct( | |
FVector AwesomeVector, | |
bool AwesomeBoolean, | |
float AwesomeFloat, | |
int32 AwesomeInteger, | |
FRotator AwesomeRotator | |
); | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Fill out your copyright notice in the Description page of Project Settings. | |
#include "YourProject.h" | |
#include "AwesomeStructGeneratorComponent.h" | |
// Sets default values for this component's properties | |
UAwesomeStructGeneratorComponent::UAwesomeStructGeneratorComponent() | |
{ | |
} | |
TArray<FAwesomeStruct> UAwesomeStructGeneratorComponent::GenerateStructsFromJson(FString Path) | |
{ | |
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonFullPath(Path)); | |
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject); | |
TArray<FAwesomeStruct> AwesomeStruct; | |
if (FJsonSerializer::Deserialize(JsonReader, JsonObject) && JsonObject.IsValid()) | |
{ | |
if (GEngine) { | |
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("Deserialize")); | |
} | |
GenerateStructsFromJson(AwesomeStructs, JsonObject); | |
} | |
else { | |
if (GEngine) { | |
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("Not Deserialize")); | |
} | |
} | |
return AwesomeStruct; | |
} | |
/* | |
** private | |
*/ | |
void UAwesomeStructGeneratorComponent::GenerateStructsFromJson( | |
TArray<FAwesomeStruct> &AwesomeStructs, | |
TSharedPtr<FJsonObject> JsonObject | |
) | |
{ | |
FVector PrevEndPoint = FVector{ 0,0,0 }; | |
TArray<TSharedPtr<FJsonValue>> objArray = JsonObject->GetArrayField(TEXT("AwesomeStructs")); | |
for (int32 i = 0; i < objArray.Num(); i++) | |
{ | |
TSharedPtr<FJsonValue> value = objArray[i]; | |
TSharedPtr<FJsonObject> json = value->AsObject(); | |
FVector AwesomeVector = ParseAsVector(json, FString("AwesomeVector")); | |
bool AwesomeBoolean = json->GetBoolField(TEXT("AwesomeBoolean")); | |
float AwesomeFloat = json->GetNumberField(TEXT("AwesomeFloat")); | |
int32 AwesomeInteger = json->GetNumberField(TEXT("AwesomeInteger")); | |
FRotator AwesomeRotator = ParseAsRotator(json, FString("AwesomeRotator")); | |
FAwesomeStruct AwesomeStruct = FAwesomeStruct::BuildAwesomeStruct( | |
AwesomeVector,AwesomeBoolean,AwesomeFloat,AwesomeInteger,AwesomeRotator | |
); | |
AwesomeStructs.Push(AwesomeStruct); | |
} | |
} | |
FString UAwesomeStructGeneratorComponent::JsonFullPath(FString Path) | |
{ | |
// Games/Content/****.json | |
FString FullPath = FPaths::GameContentDir(); | |
FullPath += Path; | |
FString JsonStr; | |
FFileHelper::LoadFileToString(JsonStr, *FullPath); | |
return JsonStr; | |
} | |
FVector UAwesomeStructGeneratorComponent::ParseAsVector(TSharedPtr<FJsonObject> json, FString KeyName) | |
{ | |
TArray<FString> ArrayJson; | |
json->TryGetStringArrayField(*KeyName, ArrayJson); | |
FVector Vector = FVector{ FCString::Atof(*ArrayJson[0]), | |
FCString::Atof(*ArrayJson[1]), | |
FCString::Atof(*ArrayJson[2]) }; | |
return Vector; | |
} | |
FRotator UAwesomeStructGeneratorComponent::ParseAsRotator(TSharedPtr<FJsonObject> json, FString KeyName) | |
{ | |
TArray<FString> ArrayJson; | |
json->TryGetStringArrayField(*KeyName, ArrayJson); | |
FRotator Rotator = FRotator{ FCString::Atof(*ArrayJson[0]), | |
FCString::Atof(*ArrayJson[1]), | |
FCString::Atof(*ArrayJson[2]) }; | |
return Rotator; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Fill out your copyright notice in the Description page of Project Settings. | |
#pragma once | |
#include "Components/ActorComponent.h" | |
#include "AwesomeStruct.h" | |
#include "AwesomeStructGeneratorComponent.generated.h" | |
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) | |
class YOURPROJECT_API UAwesomeStructGeneratorComponent : public UActorComponent | |
{ | |
GENERATED_BODY() | |
public: | |
UAwesomeStructGeneratorComponent(); | |
private: | |
void GenerateStructsFromJson(TArray<FAwesomeStruct> &AwesomeStructs, TSharedPtr<FJsonObject> JsonObject); | |
FString JsonFullPath(FString Path); | |
FVector ParseAsVector(TSharedPtr<FJsonObject> json, FString KeyName); | |
FRotator ParseAsRotator(TSharedPtr<FJsonObject> json, FString KeyName); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment