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;
}
相关推荐
cchjyq5 分钟前
嵌入式按键调参:简洁接口轻松调参(ADC FLASH 按键 屏幕参数显示)
c语言·c++·单片机·mcu·开源·开源软件
程序炼丹师5 分钟前
std::runtime_error是否会终止程序
c++
qq_433554546 分钟前
C++字符串hash
c++·算法·哈希算法
无限进步_6 分钟前
【C语言】堆(Heap)的数据结构与实现:从构建到应用
c语言·数据结构·c++·后端·其他·算法·visual studio
[苦行僧]14 分钟前
ue Gameplay Message Subsystem plugin
ue5
CodeOfCC17 分钟前
C++ 实现ffmpeg解析hls fmp4 EXT-X-DISCONTINUITY并支持定位
开发语言·c++·ffmpeg·音视频
w陆压19 分钟前
9.野指针和悬空指针
c++·c++基础知识
三月微暖寻春笋36 分钟前
【和春笋一起学C++】(五十二)关于函数返回对象时的注意事项
c++·函数·const·返回对象·返回对象的引用
leiming639 分钟前
c++ transform算法
开发语言·c++·算法
菩提祖师_43 分钟前
基于VR的虚拟会议系统设计
开发语言·javascript·c++·爬虫