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;
}
相关推荐
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_3 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星3 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛5 天前
delete又未完全delete
c++
端平入洛6 天前
auto有时不auto
c++
哇哈哈20217 天前
信号量和信号
linux·c++
多恩Stone7 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马7 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝7 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc7 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法