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;
}
相关推荐
在路上看风景6 小时前
19. 成员初始化列表和初始化对象
c++
zmzb01036 小时前
C++课后习题训练记录Day98
开发语言·c++
念风零壹7 小时前
C++ 内存避坑指南:如何用移动语义和智能指针解决“深拷贝”与“内存泄漏”
c++
孞㐑¥8 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
_风华ts9 小时前
创建并使用AimOffset
ue5·动画·虚幻·虚幻引擎·aimoffset
MZ_ZXD0019 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
A星空12310 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫11 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
会叫的恐龙11 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米60111 小时前
C++顺序表和vector
开发语言·c++·算法