UE Json 序列化和反序列化
没有什么好说的,贴出来代码,就是按照固定流程一层层解析即可
cpp
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LearnJson.h"
#include "Json.h"
#include "RequiredProgramMainCPPInclude.h"
DEFINE_LOG_CATEGORY_STATIC(LogLearnJson, Log, All);
IMPLEMENT_APPLICATION(LearnJson, "LearnJson");
struct FBagStruct
{
int32 Value1;
int32 Value2;
};
struct FMyStruct
{
FString Name;
int32 Age;
FBagStruct* Bag;
TArray<FMyStruct> Children;
FString ToString()
{
FString JsonStr;
TSharedPtr<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
ToString(JsonWriter);
JsonWriter->Close();
return JsonStr;
}
void ToString(const TSharedPtr<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>>& JsonWriter)
{
JsonWriter->WriteObjectStart();
JsonWriter->WriteValue(TEXT("Name"), Name);
JsonWriter->WriteValue(TEXT("Age"), Age);
if (Bag != nullptr)
{
JsonWriter->WriteObjectStart(TEXT("Bag"));
JsonWriter->WriteValue(TEXT("Value1"), Bag->Value1);
JsonWriter->WriteValue(TEXT("Value2"), Bag->Value2);
JsonWriter->WriteObjectEnd();
}
JsonWriter->WriteArrayStart(TEXT("Children"));
for (auto& Child : Children)
{
Child.ToString(JsonWriter);
}
JsonWriter->WriteArrayEnd();
JsonWriter->WriteObjectEnd();
}
void FromString(const TSharedPtr<FJsonObject> ReadRoot)
{
Name = ReadRoot->GetStringField(TEXT("Name"));
Age = ReadRoot->GetIntegerField(TEXT("Age"));
if (ReadRoot->HasField(TEXT("Bag")))
{
Bag = new FBagStruct();
TSharedPtr<FJsonObject> ReadBag = ReadRoot->GetObjectField(TEXT("Bag"));
Bag->Value1 = ReadBag->GetIntegerField(TEXT("Value1"));
Bag->Value2 = ReadBag->GetIntegerField(TEXT("Value2"));
}
else
{
Bag = nullptr;
}
if (ReadRoot->HasField(TEXT("Children")))
{
TArray<TSharedPtr<FJsonValue>> ReadChildren = ReadRoot->GetArrayField(TEXT("Children"));
for (auto& ReadChild : ReadChildren)
{
FMyStruct& newStruct = Children.AddDefaulted_GetRef();
newStruct.FromString(ReadChild->AsObject());
}
}
}
void FromString(const FString& JsonStr)
{
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonStr);
TSharedPtr<FJsonObject> ReadRoot;
if (FJsonSerializer::Deserialize(JsonReader, ReadRoot))
{
FromString(ReadRoot);
}
}
};
INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
FTaskTagScope Scope(ETaskTag::EGameThread);
ON_SCOPE_EXIT
{
LLM(FLowLevelMemTracker::Get().UpdateStatsPerFrame());
RequestEngineExit(TEXT("Exiting"));
FEngineLoop::AppPreExit();
FModuleManager::Get().UnloadModulesAtShutdown();
FEngineLoop::AppExit();
};
if (int32 Ret = GEngineLoop.PreInit(ArgC, ArgV))
{
return Ret;
}
// to run automation tests in BlankProgram:
// * set `bForceCompileDevelopmentAutomationTests` to `true` in `BlankProgramTarget` constructor in "BlankProgram.Target.cs"
// add `FAutomationTestFramework::Get().StartTestByName(TEXT("The name of the test class passed to IMPLEMENT_SIMPLE_AUTOMATION_TEST or TEST_CASE_NAMED"), 0);` right here
// to link with "CoreUObject" module:
// * uncomment `PrivateDependencyModuleNames.Add("CoreUObject");` in `BlankProgram` constructor in "BlankProgram.Build.cs"
// * set `bCompileAgainstCoreUObject` to `true` in `BlankProgramTarget` constructor in "BlankProgram.Target.cs"
// to enable tracing:
// * uncomment `AppendStringToPublicDefinition("UE_TRACE_ENABLED", "1");` in `BlankProgram` constructor in "BlankProgram.Build.cs"
// * uncomment `GlobalDefinitions.Add("UE_TRACE_ENABLED=1");` in `BlankProgramTarget` constructor in "BlankProgram.Target.cs"
// you may need to enable compilation of a particular trace channel, e.g. for "task" traces:
// * add `GlobalDefinitions.Add("UE_TASK_TRACE_ENABLED=1");` in `BlankProgramTarget` constructor in "BlankProgram.Target.cs"
// you'll still need to enable this trace channel on cmd-line like `-trace=task,default`
// to enable LLM tracing, uncomment the following in `BlankProgram` constructor in "BlankProgram.Build.cs":
// GlobalDefinitions.Add("LLM_ENABLED_IN_CONFIG=1");
// GlobalDefinitions.Add("UE_MEMORY_TAGS_TRACE_ENABLED=1");
//UE_LOG(LogLearnJson, Display, TEXT("Hello World"));
FMyStruct MyStruct;
MyStruct.Name = TEXT("Zhou");
MyStruct.Age = 18;
MyStruct.Bag = new FBagStruct();
MyStruct.Bag->Value1 = 10086;
MyStruct.Bag->Value2 = 20086;
MyStruct.Children.Add(FMyStruct());
MyStruct.Children[0].Name = TEXT("Child1");
MyStruct.Children[0].Age = 1;
MyStruct.Children.Add(FMyStruct());
MyStruct.Children[1].Name = TEXT("Child2");
MyStruct.Children[1].Age = 2;
MyStruct.Children.Add(FMyStruct());
MyStruct.Children[2].Name = TEXT("Child3");
MyStruct.Children[2].Age = 3;
MyStruct.Children[2].Bag = new FBagStruct();
MyStruct.Children[2].Bag->Value1 = 666;
MyStruct.Children[2].Bag->Value2 = 777;
FString JsonStr = MyStruct.ToString();
UE_LOG(LogLearnJson, Display, TEXT("JsonStr: %s"), *JsonStr);
FMyStruct MyStruct1;
MyStruct1.FromString(JsonStr);
return 0;
}