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

news2025/4/11 9:06:38

目录

方式一(不推荐)

方式二(推荐)

一、生成普通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.coloradmin.cn/o/2327687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop 2025 Mac中文 Ps图像编辑软件

Photoshop 2025 Mac中文 Ps图像编辑软件 文章目录 Photoshop 2025 Mac中文 Ps图像编辑软件一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用&#xff0c;通过智能抠图、自动修复、图像…

使用Redis构架你自己的私有大模型

使用Redis构架你自己的私有大模型--楼兰 ​ Redis你通常用来做什么?缓存?分布式锁?数据过滤器?不够不够,这远远不够。之前给大家分享过基于Redis Stack提供的一系列插件,完全可以把Redis作为一个类似于Elastic Search的JSON数据库使用。不光可以存储并操作JSON格式的数据…

从内核到应用层:Linux缓冲机制与语言缓冲区的协同解析

系列文章目录 文章目录 系列文章目录前言一、缓冲区1.1 示例11.2 缓冲区的概念 二、缓冲区刷新方案三、缓冲区的作用及存储 前言 上篇我们介绍了&#xff0c;文件的重定向操作以及文件描述符的概念&#xff0c;今天我们再来学习一个和文件相关的知识-----------用户缓冲区。 在…

【AI News | 20250403】每日AI进展

AI Repos 1、llm-server-docs 项目提供了一份基于Debian系统的本地语言模型服务器搭建指南&#xff0c;适用于Linux初学者。教程涵盖驱动安装、GPU功耗设置、自动登录配置及开机自启脚本部署等关键步骤&#xff0c;支持Ollama/vLLM等多种OpenAI兼容方案。方案设计强调四大原则…

深入理解SQL中的<>运算符:不等于的灵活运用

在SQL的世界里&#xff0c;数据的筛选与查询是最常见的操作之一。在编写查询语句时&#xff0c;比较运算符是我们不可忽视的工具&#xff0c;其中&#xff0c;<> 运算符作为 不等于 的代表&#xff0c;起着至关重要的作用。它不仅能够帮助我们筛选出符合特定条件的数据&a…

数据清洗的具体内容

&#xff08;一&#xff09;ETL介绍 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&#xff08;Load&#xff09;至目的端的过程。ETL一词较…

小家电等电子设备快充方案,XSP15支持全协议和支持MCU与电脑传输数据

随着USB-C的普及&#xff0c;市面上消费者PD充电器越来越多&#xff0c;如何让小家电等电子产品也能够支持PD协议快充呢&#xff1f;就需要加入一颗汇铭达XSP15取电协议芯片&#xff0c;这颗芯片不仅能支持取电&#xff0c;还能通过串口读取充电器支持的最大输出功率和支持外部…

缺页异常导致的iowait打印出相关文件的绝对路径

一、背景 在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowait分析-CSDN博客 里&#xff0c;我们进一步优化了D状态和等IO状态的事件的堆栈打印&#xff0c;补充了唤醒堆栈打印&#xff0c;也分析了一种比较典型的缺页异常filemap_fault导致的iowait的情况。 在这篇…

记录学习的第十七天

今天对昨天下午的洛谷蓝桥杯模拟赛和今天早上的力扣周赛进行复盘。 昨天的蓝桥杯模拟赛&#xff0c;硬坐了4个小时&#xff0c;只会做前面的三道入门题。&#x1f625;而且第一道填空题竟然还算错了。其他的五道题我都没啥思路了&#xff0c;实在难受啊&#xff01; Q1:这道题硬…

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比

全面解析 Mybatis 与 Mybatis-Plus&#xff1a;深入原理、实践案例与高级特性对比 &#x1f680; 前言一、基础介绍 ✨1. Mybatis 简介 &#x1f50d;2. Mybatis-Plus 简介 ⚡ 二、核心区别与高级特性对比 &#x1f50e;1. 开发模式与配置管理2. 功能丰富度与扩展性3. 自动填充…

Ubuntu 22.04 一键部署openManus

openManus 前言 OpenManus-RL,这是一个专注于基于强化学习(RL,例如 GRPO)的方法来优化大语言模型(LLM)智能体的开源项目,由来自UIUC 和 OpenManus 的研究人员合作开发。 前提要求 安装deepseek docker方式安装 ,windows 方式安装,Linux安装方式

强化学习_Paper_1988_Learning to predict by the methods of temporal differences

paper Link: sci-hub: Learning to predict by the methods of temporal differences 1. 摘要 论文介绍了时间差分方法&#xff08;TD 方法&#xff09;&#xff0c;这是一种用于预测问题的增量学习方法。TD 方法通过比较连续时间步的预测值之间的差异来调整模型&#xff0c;…

Apache httpclient okhttp

学习链接 okhttp github okhttp官方使用文档 SpringBoot 整合okHttp okhttp3用法 Java中常用的HTTP客户端库&#xff1a;OkHttp和HttpClient&#xff08;包含请求示例代码&#xff09; 深入浅出 OkHttp 源码解析及应用实践 httpcomponents-client github apache httpclie…

Docker部署Blinko:打造你的个性化AI笔记助手与随时随地访问

文章目录 前言1. Docker Compose一键安装2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 嘿&#xff0c;小伙伴们&#xff0c;是不是觉得市面上那些单调乏味的笔记应用让人提不起劲&#xff1f;今天&#xff0c;我要给大家安利一个超炫酷的开源…

【文献研究】铝对热冲压加热过程中锌氧化的影响

在热冲压过程中&#xff0c;镀锌铁板和镀锌板等镀锌钢板表面发生Zn氧化。为了阐明镀锌层中的Al对Zn氧化的影响&#xff0c;本研究研究了镀锌钢板上添加和不添加Al时形成的ZnO量。发现添加铝后ZnO量减少。对添加铝的镀锌钢板的显微组织分析表明&#xff0c;添加的Al在热冲压后Zn…

Win11本地从零开始部署dify全流程

1.安装wsl和打开Hyper-V功能&#xff08;前置准备&#xff09; 这个是为了支持我们的Docker Desktop运行。 1.1.安装wsl 使用管理员身份运行命令行。 如果显示 “无法与服务器建立连接就执行“&#xff0c;表示没有安装wsl&#xff0c;如果更新成功&#xff0c;那就不用执行…

【HTB】Windwos-easy-Legacy靶机渗透

靶机介绍&#xff0c;一台很简单的WIndows靶机入门 知识点 msfconsole利用 SMB历史漏洞利用 WIndows命令使用&#xff0c;type查看命令 目录标题 一、信息收集二、边界突破三、权限提升 一、信息收集 靶机ip&#xff1a;10.10.10.4攻击机ip&#xff1a;10.10.16.26 扫描TC…

蓝桥杯真题———k倍区间

题目如下 代码如下 记录余数 cnt[0] 1 的初始化是为了处理 空前缀和 说明

无人机等非合作目标公开数据集2025.4.3

一.无人机遥感数据概述 1.1 定义与特点 在遥感技术的不断发展中&#xff0c;无人机遥感数据作为一种新兴的数据源&#xff0c;正逐渐崭露头角。它是通过无人驾驶飞行器&#xff08;UAV&#xff09;搭载各种传感器获取的地理空间信息&#xff0c;具有 覆盖范围大、综合精度高、…

机器视觉--python基础语法

Python基础语法 1. Python标识符 在 Python 里&#xff0c;标识符由字母、数字、下划线组成。 在 Python 中&#xff0c;所有标识符可以包括英文、数字以及下划线(_)&#xff0c;但不能以数字开头。 Python 中的标识符是区分大小写的。 以下划线开头的标识符是有特殊意义的…