UE Json 序列化和反序列化

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;
}
相关推荐
郝学胜_神的一滴2 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天2 天前
C++ 基础入门完全指南
c++
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK4 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
Venuslite4 天前
从 Unexpected token < 到 Extra data:一次讲清 JSON 解析错误的排查思路
json
卷无止境5 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境5 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴6 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境8 天前
C++ 的Eigen 库全解析
c++
卷无止境8 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端