-
-
Save hanzochang/07eba255ce0d1695582a92e98e973200 to your computer and use it in GitHub Desktop.
{ | |
"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], | |
}, | |
] | |
} |
#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; | |
} |
// 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 | |
); | |
}; |
// 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; | |
} |
// 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); | |
}; |
//Pretty sure it should look like that you might have too bring in too the left one tab spacing
{
"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]
}
]
}
Thanks for this. How would you change this if your json was enclosed in an array.
Example:
[{
"geometry":
{
"type": "Polygon",
"coordinates":
[
[
[
-156.09375,
19.311143355064644
],
[
-156.09375,
19.973348786110606
],
[
-155.390625,
19.973348786110606
],
[
-155.390625,
19.311143355064644
],
[
-156.09375,
19.311143355064644
]
]
]
},
"type": "Feature",
"properties":
{},
"layer":
{
"id": "bounding_box",
"type": "fill",
"source": "bounding_box_source",
"paint":
{
"fill-color":
{
"r": 0,
"g": 0.5333333333333333,
"b": 0.5333333333333333,
"a": 1
},
"fill-opacity": 0.45
},
"layout":
{}
},
"source": "bounding_box_source",
"state":
{}
},
{
"geometry":
{
"type": "Polygon",
"coordinates":
[
[
[
-155.56640625,
19.973348786110606
],
[
-155.390625,
19.973348786110606
],
[
-155.390625,
19.311143355064644
],
[
-155.56640625,
19.311143355064644
],
[
-155.56640625,
19.973348786110606
]
]
]
},
"type": "Feature",
"properties":
{},
"layer":
{
"id": "bounding_box",
"type": "fill",
"source": "bounding_box_source",
"paint":
{
"fill-color":
{
"r": 0,
"g": 0.5333333333333333,
"b": 0.5333333333333333,
"a": 1
},
"fill-opacity": 0.45
},
"layout":
{}
},
"source": "bounding_box_source",
"state":
{}
}]
Thanks!
It is a good document but you have declaration and dependency errors.