【UE5 C++课程系列笔记】33——商业化Json读写

目录

前言

步骤

一、写入

二、读取


前言

有时候我们会获取到如下形式的Json,其中Data字段的内容经过字符串化处理。本篇文章介绍如何读写这种形式的Json。

步骤

一、写入

cpp 复制代码
void ASampleJson::WriteBadJson()
{
	// 创建主JSON对象
	TSharedPtr<FJsonObject> MainJsonObject = MakeShareable(new FJsonObject());

	// 添加基本类型字段
	MainJsonObject->SetNumberField("Code", 998);
	MainJsonObject->SetStringField("Message", "Success");

	// 创建内部JSON对象
	TSharedPtr<FJsonObject> InnerJsonObject = MakeShareable(new FJsonObject());
	InnerJsonObject->SetStringField("ServerName", "ZhiChao");
	InnerJsonObject->SetNumberField("ServerVersion", 1.0f);

	// 将内部JSON对象序列化为紧凑格式的字符串
	FString InnerJsonString;
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> InnerJsonWriter
		= TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&InnerJsonString);	
	FJsonSerializer::Serialize(InnerJsonObject.ToSharedRef(), InnerJsonWriter);
	InnerJsonWriter->Close();

	// 将内部JSON字符串添加到主JSON对象的Data字段
	MainJsonObject->SetStringField("Data", InnerJsonString);

	// 将主JSON对象序列化为最终的JSON字符串
	FString FinalJsonString;
	TSharedRef<TJsonWriter<>> FinalJsonWriter = TJsonWriterFactory<>::Create(&FinalJsonString);
	FJsonSerializer::Serialize(MainJsonObject.ToSharedRef(), FinalJsonWriter);  //将JSON对象InnerJsonObject序列化为字符串
	FinalJsonWriter->Close();

	FString FilePath = FPaths::ProjectSavedDir() / TEXT("BadJson.json");
	if (FFileHelper::SaveStringToFile(FinalJsonString, *FilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM))
	{
		UE_LOG(LogTemp, Warning, TEXT("JSON 文件保存成功: %s"), *FilePath);
	}
	else
	{
		UE_LOG(LogTemp, Error, TEXT("JSON 文件保存失败: %s"), *FilePath);
	}
}

最关键的部分是将Json对象序列化为字符串

二、读取

cpp 复制代码
void ASampleJson::ReadBadJson()
{
	//从文件中获取Json字符串
	FString JsonFilePath = FPaths::ProjectSavedDir() / TEXT("BadJson.json");
	FString JsonString = TEXT("");
	FFileHelper::LoadFileToString(JsonString, *JsonFilePath);

	//通过Json字符串构建Json对象
	TSharedPtr<FJsonObject> JsonObject;
	TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonString);  //创建JSON读取器
	FJsonSerializer::Deserialize(JsonReader, JsonObject);  //使用JSON序列化器将JsonString解析为JsonObject

	//解析Json
	int32 Code = JsonObject->GetNumberField(TEXT("Code"));
	FString Message = JsonObject->GetStringField(TEXT("Message"));

	FString Data = JsonObject->GetStringField(TEXT("Data"));
	TSharedPtr<FJsonObject> DataJsonObject;
	TSharedRef<TJsonReader<TCHAR>> DataJsonReader = TJsonReaderFactory<TCHAR>::Create(Data);
	FJsonSerializer::Deserialize(DataJsonReader, DataJsonObject);
	FString ServerName = DataJsonObject->GetStringField(TEXT("ServerName"));
	float ServerVersion = DataJsonObject->GetNumberField(TEXT("ServerVersion"));
}

其中最关键的部分是将Json字符串转化为Json对象

相关推荐
AI thought4 分钟前
C语言、C++与C#深度研究报告:从底层控制到现代企业级开发的演进
c语言·c++·c·内存管理·编译模型
我命由我123456 分钟前
RFID 技术极简理解
java·c语言·c++·嵌入式硬件·物联网·visualstudio·java-ee
格发许可优化管理系统13 分钟前
Mentor许可证与其他软件许可证的深度比较
java·大数据·运维·c语言·c++·算法
吃着火锅x唱着歌18 分钟前
深度探索C++对象模型 学习笔记 第六章 执行期语意学(1)
c++·笔记·学习
xxwl58534 分钟前
工作室小测的部分记录
c++·学习·算法
程序员zgh37 分钟前
C++ 万能引用与完美转发
c语言·开发语言·c++·经验分享·学习
智者知已应修善业38 分钟前
【51单片机串口通信甲机四个按键模拟四位二进制值发送乙机以十进制显示2位数码管】2024-6-14
c++·经验分享·笔记·算法·51单片机
郝学胜_神的一滴1 小时前
CMake 018:解决头文件编译失效\&VS项目无法展示头文件难题
c++·cmake
影视飓风TIM1 小时前
C++ 核心语法进阶:【类和对象终章】从对象拷贝到友元与优化(补上期重载)
c++
小鹏linux1 小时前
鸿蒙PC迁移:Tesseract OCR C++ 三方库鸿蒙适配全记录
c++·ocr·harmonyos