当前位置: 首页 > news >正文

【UE5 C++课程系列笔记】31——创建Json并保存为文件

目录

方式一(不推荐)

方式二(推荐)

一、生成普通Json对象 

二、对象嵌套对象

三、对象嵌套数组

四、对象嵌套数组再嵌套对象


方式一(不推荐)

如下代码实现了把JSON字符串保存到文件中

#include "Misc/FileHelper.h"

void ASampleJson::NotGoodJson()
{
	struct TempMessageInfo {
		int32 UECode = -1;
		FString UEMessage = TEXT("");
		FString UEData = TEXT("");
		FString UESid = TEXT("");
	};
	TempMessageInfo MyTempInfo;
	MyTempInfo.UECode = 998;
	MyTempInfo.UEMessage = TEXT("test");
	MyTempInfo.UEData = TEXT("123456");
	MyTempInfo.UESid = TEXT("11111");

	FString NotGoodJson = FString::Printf(TEXT("{\"Code\":%d,\"Message\":\"%s\",\"Data\":\"%s\",\"Sid\":\"%s\"}"), MyTempInfo.UECode, *MyTempInfo.UEMessage, *MyTempInfo.UEData, *MyTempInfo.UESid);
	FString FilePath = FPaths::ProjectSavedDir() / TEXT("NoGoodJson.json");
	FFileHelper::SaveStringToFile(NotGoodJson, *FilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);
}

方式二(推荐)

一、生成普通Json对象 

使用引擎自带的“Json”、“JsonUtilities”模块。

1. 打开“xx.Build.cs”,添加“Json”、“JsonUtilities”模块

2. 新建一个actor,这里命名为“SampleJson”,然后定义蓝图可调用的函数,这里命名为“GoodJson”

引入与 JSON 处理相关的头文件,其中:

  1. #include "Policies/CondensedJsonPrintPolicy.h":、包含了FCondensedJsonPrintPolicy,该策略用于以紧凑格式打印 JSON 数据,也就是去掉不必要的空格和换行符,使 JSON 字符串更为精简。
  2. #include "Serialization/JsonWriter.h":包含了用于将 JSON 对象序列化为字符串的FJsonWriter类。你能够用它把FJsonObject转化为 JSON 字符串。
  3. #include "Serialization/JsonReader.h":包含了用于将 JSON 字符串反序列化为 JSON 对象的FJsonReader类。你可以用它把 JSON 字符串解析成FJsonObject
  4. #include "JsonObjectConverter.h":提供了一系列工具函数,可用于在 UEC++ 结构体和 JSON 对象之间进行转换。

 实现函数“GoodJson”如下,该函数构建了一个 JSON 字符串,再把它保存到项目的 Saved 目录下名为 GoodJson.json 文件里

3. 创建父类为“SampleJson”的蓝图类,这里命名为“BP_SampleJson”,然后在Event BeginPlay中调用函数“GoodJson”

4. 运行后可以看到JSON字符串成功保存为JSON文件

二、对象嵌套对象

如果希望在Json中嵌套Json,可以在生成的 JSON 数据里创建一个名为 "Server" 的嵌套对象,并且把相关信息写入这个对象。

最后生成的JSON文件内容如下

三、对象嵌套数组

首先定义一个数组,然后为数组赋值

将数组元素依次添加到JSON嵌套的数组中

生成后的文件内容如下,可以看到成功添加了JSON数组

四、对象嵌套数组再嵌套对象

在第三步中已经创建了一个数组,现在准备在该数组中继续嵌套对象,代码如下:

文件存储结果如下:

完整代码:

// Fill out your copyright notice in the Description page of Project Settings.


#include "Json/SampleJson.h"
#include "Misc/FileHelper.h"

#include "Policies/CondensedJsonPrintPolicy.h"
#include "Serialization/JsonWriter.h"
#include "Serialization/JsonReader.h"
#include "JsonObjectConverter.h"

// Sets default values
ASampleJson::ASampleJson()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

void ASampleJson::GoodJson()
{
	FString GoodJsonString = TEXT("");
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> GoodJsonWriter 
		= TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&GoodJsonString);

	TArray<int32> WorkerIDs;
	WorkerIDs.Add(1);
	WorkerIDs.Add(2);
	WorkerIDs.Add(3);

	GoodJsonWriter->WriteObjectStart();

	GoodJsonWriter->WriteValue(TEXT("Code"), 998);
	GoodJsonWriter->WriteValue(TEXT("Message"), TEXT("Test"));
	GoodJsonWriter->WriteValue(TEXT("Data"), TEXT("123456"));
	GoodJsonWriter->WriteValue(TEXT("Sid"), TEXT("11111"));

	{
		GoodJsonWriter->WriteObjectStart(TEXT("Server"));
		GoodJsonWriter->WriteValue(TEXT("ServerName"), TEXT("ZhiChao"));
		GoodJsonWriter->WriteValue(TEXT("ServerVersion"), TEXT("V1.0"));
		GoodJsonWriter->WriteObjectEnd();
	}

	{
		GoodJsonWriter->WriteArrayStart(TEXT("MyArray"));
		for (auto& TmpID : WorkerIDs)
		{
			GoodJsonWriter->WriteValue(TmpID);
		}
		GoodJsonWriter->WriteArrayEnd();
	}

	{
		GoodJsonWriter->WriteArrayStart(TEXT("Workers"));
		for (auto& TmpID : WorkerIDs)
		{
			GoodJsonWriter->WriteObjectStart();
			GoodJsonWriter->WriteValue(TEXT("ID"), TmpID);
			GoodJsonWriter->WriteValue(TEXT("Name"), TEXT("Zhichao"));
			GoodJsonWriter->WriteValue(TEXT("Age"), 18);
			GoodJsonWriter->WriteObjectEnd();
		}
		GoodJsonWriter->WriteArrayEnd();
	}
	
	GoodJsonWriter->WriteObjectEnd();
	GoodJsonWriter->Close();

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

// Called when the game starts or when spawned
void ASampleJson::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void ASampleJson::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}
http://www.dtcms.com/a/113299.html

相关文章:

  • 横扫SQL面试——TopN问题
  • 团体设计程序天梯赛L2-025 # 分而治之
  • Maven使用
  • 3535 数组分割
  • Python 数据库选型指南(架构师视角)
  • BUUCTF-web刷题篇(12)
  • 智能体和RPA都需要程序思维,如何使用影刀的变量?
  • HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context
  • Python解决“数字插入”问题
  • 英语听力4.5
  • 6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)
  • Python作业3 字符田字格绘制
  • C语言之标准库中的常用api
  • 必刷算法100题之计算右侧小于当前元素的个数
  • 【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)
  • Linux数据库:【数据库基础】【库的操作】【表的操作】
  • [SAP SD] 常用事务码
  • Linux的/proc/sys/net/ipv6/conf/(all,default,interfaceName具体网络接口名称)/ 笔记250405
  • 国产系统统信uos和麒麟v10在线打开word给表格赋值
  • HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口
  • ConstructorResolver
  • Day2-2:前端项目uniapp壁纸实战
  • HashMap 底层原理详解
  • C++学习之LINUX网络编程-套接字通信基础
  • JWT认证服务
  • [MySQL初阶]MySQL(9)事务机制
  • 基于springboot+vue的二手车交易系统
  • Supervisor的安装和使用
  • 0101安装matplotlib_numpy_pandas-报错-python
  • Business English Certificates (BEC) 高频词汇学习