diff --git a/Source/SIOJson/Private/SIOJConvert.cpp b/Source/SIOJson/Private/SIOJConvert.cpp index 712c212..0678981 100644 --- a/Source/SIOJson/Private/SIOJConvert.cpp +++ b/Source/SIOJson/Private/SIOJConvert.cpp @@ -835,36 +835,52 @@ bool USIOJConvert::JsonObjectToUStruct(TSharedPtr JsonObject, UStru bool USIOJConvert::JsonFileToUStruct(const FString& FilePath, UStruct* Struct, void* StructPtr, bool IsBlueprintStruct /*= false*/) { //Read bytes from file - TArray OutBytes; - if (!FFileHelper::LoadFileToArray(OutBytes, *FilePath)) + TArray ReadBytes; + if (!FFileHelper::LoadFileToArray(ReadBytes, *FilePath)) { return false; } - //Convert to json string - FString JsonString; - FFileHelper::BufferToString(JsonString, OutBytes.GetData(), OutBytes.Num()); - - //Read into struct - return JsonObjectToUStruct(ToJsonObject(JsonString), Struct, StructPtr, IsBlueprintStruct); + return BytesToStruct(ReadBytes, Struct, StructPtr, IsBlueprintStruct); } bool USIOJConvert::ToJsonFile(const FString& FilePath, UStruct* Struct, void* StructPtr, bool IsBlueprintStruct /*= false*/) +{ + TArray Bytes; + StructToBytes(Struct, StructPtr, Bytes, IsBlueprintStruct); + + //flush to disk + return FFileHelper::SaveArrayToFile(Bytes, *FilePath); +} + +bool USIOJConvert::StructToBytes(UStruct* Struct, void* StructPtr, TArray& OutBytes, bool IsBlueprintStruct) { //Get json object with trimmed values TSharedPtr JsonObject = ToJsonObject(Struct, StructPtr, IsBlueprintStruct); TSharedPtr TrimmedValue = MakeShareable(new FJsonValueObject(JsonObject)); - TrimValueKeyNames(TrimmedValue); + + if (IsBlueprintStruct) + { + TrimValueKeyNames(TrimmedValue); + } //Convert to string FString JsonString = ToJsonString(TrimmedValue); FTCHARToUTF8 Utf8String(*JsonString); - TArray Bytes; - Bytes.Append((uint8*)Utf8String.Get(), Utf8String.Length()); + OutBytes.Append((uint8*)Utf8String.Get(), Utf8String.Length()); - //flush to disk - return FFileHelper::SaveArrayToFile(Bytes, *FilePath); + return true; +} + +bool USIOJConvert::BytesToStruct(const TArray& InBytes, UStruct* Struct, void* StructPtr, bool IsBlueprintStruct) +{ + //Convert to json string + FString JsonString; + FFileHelper::BufferToString(JsonString, InBytes.GetData(), InBytes.Num()); + + //Read into struct + return JsonObjectToUStruct(ToJsonObject(JsonString), Struct, StructPtr, IsBlueprintStruct); } void USIOJConvert::TrimValueKeyNames(const TSharedPtr& JsonValue) diff --git a/Source/SIOJson/Public/SIOJConvert.h b/Source/SIOJson/Public/SIOJConvert.h index dbcfd50..3836a9d 100644 --- a/Source/SIOJson/Public/SIOJConvert.h +++ b/Source/SIOJson/Public/SIOJConvert.h @@ -48,6 +48,9 @@ class SIOJSON_API USIOJConvert : public UObject static bool JsonFileToUStruct(const FString& FilePath, UStruct* Struct, void* StructPtr, bool IsBlueprintStruct = false); static bool ToJsonFile(const FString& FilePath, UStruct* Struct, void* StructPtr, bool IsBlueprintStruct = false); + static bool StructToBytes(UStruct* Struct, void* StructPtr, TArray& OutBytes, bool IsBlueprintStruct = false); + static bool BytesToStruct(const TArray& InBytes, UStruct* Struct, void* StructPtr, bool IsBlueprintStruct = false); + //typically from callbacks static class USIOJsonValue* ToSIOJsonValue(const TArray>& JsonValueArray);