UE4中文本文件配置文件Json文件XML文件的读写

2023-10-27

虚幻引擎中提供了与平台无关的文件读写与访问接口,通过调用,可以完成一些文件的读写。比如文本文件,配置文件,json文件,xml文件等。

完成文件读写,首先需要获取文件路径等相关信息。对调用这些操作,我们需要包含头文件PlatformFilemanager.h和FileHelper.h。对于json文件读写,我们需要在.build.cs文件中添加Json和JsonUtilities两个模块;对于xml文件读取,我们需要在.build.cs文件中添加XmlParser模块。引用相关模块后,在具体实现需要引入对应的头文件。我们可以创建一个继承自UBlueprintFunctionLibrary的C++类,这样我们就可以在蓝图中调用我们在C++中声明BlueprintCallable创建的函数。

需要引入的头文件:

#include "PlatformFilemanager.h"
#include "FileHelper.h"

#include "Json.h"
#include "JsonObject.h"
#include "JsonSerializer.h"

#include"Runtime/XmlParser/Public/XmlFile.h"
#include"Runtime/XmlParser/Public/XmlNode.h"

函数方法声明(FunctionLIbrary.h):

//文本文件读写
	UFUNCTION(BlueprintCallable, Category = "Test")
		static void WriteText(FString path,FString data);
	UFUNCTION(BlueprintCallable, Category = "Test")
		static FString ReadText(FString path);

	//配置文件读写
	UFUNCTION(BlueprintCallable, Category = "Test")
		static void WriteConfig(FString section, FString name, FString value, FString path);
	UFUNCTION(BlueprintCallable, Category = "Test")
		static FString ReadConfig(FString section, FString name, FString path);

	//UE4读取json文件
	UFUNCTION(BlueprintCallable, Category = "Test")
		static void NonSeriWriteJson();
	UFUNCTION(BlueprintCallable, Category = "Test")
		static void SeriWriteJson();
	UFUNCTION(BlueprintCallable, Category = "Test")
		static TArray<FName> ReadJson();

	//UE4读取xml文件
	UFUNCTION(BlueprintCallable, Category = "Test")
		static void CreateXmlFile();
	UFUNCTION(BlueprintCallable, Category = "Test")
		static void ReadXmlFile(const FString &XmlPath);

函数方法实现(FunctionLibrary.cpp):

void UFunctionLibrary::WriteText(FString path, FString data){
	FString ProjectDir = FPaths::GameDir();
	ProjectDir += path;
	if (!ProjectDir.Contains(".txt")) {
		ProjectDir += ".txt";
	}
	FFileHelper::SaveStringToFile(data, *ProjectDir);
}

FString UFunctionLibrary::ReadText(FString path){
	FString data;
	FString ProjectDir = FPaths::GameDir();
	ProjectDir += path;
	if (!ProjectDir.Contains(".txt")) {
		ProjectDir += ".txt";
	}
	if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ProjectDir)) {
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Couldn't find file"));
		return FString();
	}
	else {
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Could find file"));
		FFileHelper::LoadFileToString(data, *ProjectDir);
		return data;
	}
}

void UFunctionLibrary::WriteConfig(FString section, FString name, FString value, FString path){
	if (!path.Contains(".ini")) {
		path += ".ini";
	}
	GConfig->SetString(*section, *name, *value, FPaths::GameDir() / *path);
}

FString UFunctionLibrary::ReadConfig(FString section, FString name, FString path){
	FString result;
	if (!path.Contains(".ini")) {
		path += ".ini";
	}
	GConfig->GetString(*section, *name, result, FPaths::GameDir() / *path);
	return result;
}

void UFunctionLibrary::NonSeriWriteJson()
{
	FString FilePath = FPaths::GameDir() + TEXT("MyJson.json");
	FString jsonStr;
	TSharedRef<TJsonWriter<>> jsonWriter = TJsonWriterFactory<>::Create(&jsonStr);
	jsonWriter->WriteObjectStart();
	jsonWriter->WriteValue(TEXT("json"), TEXT("jsonValue"));
	jsonWriter->WriteObjectEnd();
	jsonWriter->Close();
	FFileHelper::SaveStringToFile(jsonStr, *FilePath);
}

void UFunctionLibrary::SeriWriteJson()
{
	TSharedPtr<FJsonObject> RootObj = MakeShareable(new FJsonObject());
	RootObj->SetStringField("root", "000");
	TArray<TSharedPtr<FJsonValue>> arrValue;
	TSharedPtr<FJsonValueString> tmp = MakeShareable(new FJsonValueString("element"));
	arrValue.Add(tmp);
	RootObj->SetArrayField("array", arrValue);
	FString FilePath = FPaths::GameDir() + TEXT("MySeri.json");
	FString jsonStr;
	TSharedRef<TJsonWriter<TCHAR>> jsonWriter = TJsonWriterFactory<TCHAR>::Create(&jsonStr);
	FJsonSerializer::Serialize(RootObj.ToSharedRef(), jsonWriter);
	FFileHelper::SaveStringToFile(jsonStr, *FilePath);
}

TArray<FName> UFunctionLibrary::ReadJson()
{
	FString FilePath = FPaths::GameDir() + TEXT("MyJson.json");
	if (FPaths::FileExists(FilePath))
	{
		FString section1;
		FString section2;
		FString section3;
		FString section4;
		TArray<FName> jsonData;
		FString fileStr;
		FFileHelper::LoadFileToString(fileStr, *FilePath);
		TSharedPtr<FJsonObject> rootObject = MakeShareable(new FJsonObject());
		TSharedRef<TJsonReader<>> jsonReader = TJsonReaderFactory<>::Create(fileStr);
		if (FJsonSerializer::Deserialize(jsonReader, rootObject))
		{
			section1 = rootObject->GetStringField("json");
			section2 = rootObject->GetStringField("xml");
			section3 = rootObject->GetStringField("text");
			section4 = rootObject->GetStringField("config");
		}
		jsonData.Add(FName(*section1));
		jsonData.Add(FName(*section2));
		jsonData.Add(FName(*section3));
		jsonData.Add(FName(*section4));
		return jsonData;
	}
	return TArray<FName>();
}

void UFunctionLibrary::CreateXmlFile()
{
	const FString XmlContent = "<DocumentElement>\n<Infor>\n< ID>xml </ID >\n<Name>file</Name>\n<Content>cccc</Content>\n</Infor>\n</DocumentElement>";
	FXmlFile* WriteXml = new FXmlFile(XmlContent, EConstructMethod::ConstructFromBuffer);
	if (WriteXml == nullptr)
	{
		GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("fail!"));
		return;
	}
	WriteXml->Save(FPaths::GameDir() + "xml.xml");
	GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Blue, TEXT("succeed!"));
}

void UFunctionLibrary::ReadXmlFile(const FString &XmlPath)
{
	FXmlFile* XmlFile = new FXmlFile(XmlPath);
	FXmlNode* RootNode = XmlFile->GetRootNode();
	const TArray<FXmlNode*> AssetNodes = RootNode->GetChildrenNodes();
	for (FXmlNode* node : AssetNodes)
	{
		const TArray<FXmlNode*> ChildNodes = node->GetChildrenNodes();
		FString AssetContent = node->GetContent();
		GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, AssetContent);
		for (FXmlNode* node : ChildNodes)
		{
			FString ChildContent = node->GetContent();
			GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Blue, ChildContent);
		}
	}
}

备注(若干函数类和方法介绍):

  • FPaths::GameContentDir()返回当前工程Content文件夹路径
  • TJsonWriter<>是UE4专门用于写Json的模板类,类型常用参数为TCHAR,主要方法有:
函数 作用
Close() 关闭写工具
WriterArrayStart() 开始一个Json数组
WriterArrayEnd() 结束一个Json数组
WriterNull(FString) 为一个键写入空值
WriterObjectStart() 开始一个Json对象
WriterObjectEnd() 结束一个Json对象
WriterValue(FString,FString/int32/float/bool) 向Json文件写入键值对
  • TJsonWriterFactory<>Create(FString)是UE4用来生成Json写工具TJsonWriter<>的类。TJsonFactory<>只有一个方法Create;
  • FFileHelper是UE4中文件读写工具,方法SaveStringToFile(TJsonWriter*,FString*)作用是将Json写工具中的Json数据写到FString字符串的路径文件中。
  • 使用非序列化方式写入Json时,写入方式需要严格按照Json的语法格式来做,如最开始需要使用WriterObjectStart()创建一个根前括号,即Json语法中最外面一层的{,所有写入结束后需要使用WriterObjectEnd()声明根对象结束,即Json语法中的最外面一层的},同理数组也需要按对象一样的方法进行处理。如此才能写入一个结构完整的Json文本。
  • 序列化的写入方式则无需考虑按照Json的语法结构进行写入,序列化的写入方式是通过一个FJsonObject对象进行Json文本写入。
  • 序列化写好的FJsonObject对象需要转换为FString字符串才能向文本中写入数据,FJsonObject转化为FString输入流的方式是FJsonSerializer::Serialize(TSharePtr<FJsonObject>.ToShareRef(),TSharePtr<FJsonWriter>);其中TSharePtr<FJsonWriter>和非序列化写入一样需要绑定一个FString作为输入流载体。
  • Json文本的读取,需要将Json文本以字符串的形式读入到一个FString的输入流载体中,然后将这个输入流载体绑定到TJsonReader<>读工具上,然后使用FJsonSerializer::Deserialize(TSharePtr<TJsonReader<>>,TSahrePtr<FJsonObject>)将输入流载体的Json数据反序列化到FJsonObject对象中,最后使用FJsonObject对象中的GetArrayField(FString)、GetBoolFiled(FString)、GetNumberField(FString)、GetStringField(FString)、GetObjectField(FString)、GetField(FString)等方法从Json对象中读取指定键的值。

蓝图节点:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4中文本文件配置文件Json文件XML文件的读写 的相关文章

随机推荐

  • CXL 2.0 Device配置空间寄存器组成

    目录 1 配置空间 1 1 PCI Power Management Capability Structure 1 2 PCI Express Capability Structure 2 扩展配置空间 2 1 Virtual Channe
  • Java~实现简单的扑克牌,洗牌,发牌,玩捉鬼游戏(讲解详细,代码齐全)

    目录 一 扑克牌的定义 1 牌的定义 2 玩家的定义 二 扑克牌的操作 初始化 洗牌 发牌等 1 初始化 2 洗牌 3 发牌 三 初始化 洗牌 发牌代码 全 四 捉鬼游戏 首先一副扑克牌是54张 这里我们去掉大小王 也就是52张扑克牌 有
  • layui多文件上传_EasyUI的filebox组件实现多文件上传的步骤

    EasyUI的filebox组件实现多文件上传的步骤 新增回款记录详情里面有个添加回款记录文件的按钮 点击选择文件 文件既可以选择一个也可以选择多个 img 点击并拖拽以移动
  • 锁升级

    synchronized锁升级机制 普通对象对象头 Mark Word与锁息息相关 后面的Klass Word与锁无关 不讨论 Mark Word结构 public class Syn static int a 0 public stati
  • 服务器有时候显示美国,美国服务器不通的情况解决方法

    最近有朋友跟小编反馈美国服务器会出现不通的情况 这是什么原因呢 1 大网络环境的的原因 很多时候 我们是使用移动 电信和联通的线路 电信的是最常用的 突然网络不通的话 检查咨询下机房看是不是环境大网络出现什么异常 有的时候 美国得走的是国际
  • QT跨线程连接信号和槽

    对QT的信号和槽理解较为初级 今天通过多次尝试 终于学会了跨线程连接信号和槽 其基本方法如下 1 无参数传递时 1 定义 signal void signal1 2 连接部分写法 connect p class1 类1的指针 SIGNAL
  • WDK学习笔记_基于区块链溯源系统的后端接口开发

    文章目录 摘要 一 fabric go sdk各个封装函数的功能介绍 1 1 查询指定节点通道是否已经存在 函数 QuerySavedChannel 1 2 创建并加入通道 函数 CreateChannel 1 3 查询指定节点的指定链码是
  • Python类中的self到底是干啥的

    Python类中的self到底是干啥的 Python编写类的时候 每个函数参数第一个参数都是self 一开始我不管它到底是干嘛的 只知道必须要写上 后来对Python渐渐熟悉了一点 再回头看self的概念 似乎有点弄明白了 首先明确的是se
  • Vue语法(四)

    一 组件的自定义事件 1 一种组件间通信的方式 适用于 strong style color red 子组件 gt 父组件 strong 2 使用场景 A是父组件 B是子组件 B想给A传数据 那么就要在A中给B绑定自定义事件 span st
  • 2021-07-21训练日记upc联通数(思维)

    A 联通数 题目描述 数学高手小G最近发现了一种新型的数 他首先在草稿纸写下任意长度的数字串kkkkkkkkkkk 1 k 9 并在其中间添加加号 且相邻两个加号之间至少含有两个数字k 默认数字串第一个数字前与最后一个数字后也有两个加号 然
  • React+antdPro4+TS(typescript)相关(知识点)踩坑记录

    最近公司新开了项目 是后台管理系统 在技术选型上选择的时候 选择了react 然后整体的框架选择的是antd pro 4 这个脚手架搭建出来的单页面应用 要是想要仔细了解antd pro 可以看一下他的官方文档 antd pro 此次开发整
  • [c#][process]下发单个以及同时多条adb指令

    库 using System Diagnostics private Process cmd process 下发单条adb指令 代码示例 private string GetAdbCommandsArguments string cmds
  • fiddler设置只抓取某个网址的信息

    1 前提 在使用fiddler进行抓包过程中 如果想只抓取某一个地址下的请求 可以如下设置 2 设置 1 打开fiddler 选择过滤器 2 选择仅显示以下主机 3 点击 动作 选择 现在运行筛选器 4 打开百度 输入信息 进行搜索 查看抓
  • 字符分割算法研究

    字符分割 定义 以字符串的形式分割字符 达到将验证码分割的效果 从定位得到的车牌图像中分离出单个字符 包括汉字 字母和数字等 的图像 以便于字符分割 初步了解 行切分 字切分 参考范例 车牌识别 主要算法解析 改进的连通域分割法 版面分割是
  • 线程池基础知识

    1 为什么要使用线程池 线程池用什么用 创建线程和销毁线程的花销是比较大的 这些时间有可能比处理业务的时间还要长 这样频繁的创建线程和销毁线程 再加上业务工作线程 消耗系统资源的时间 可能导致系统资源不足 我们可以把创建和销毁的线程的过程去
  • Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    利用ssh传输文件 在linux下一般用scp这个命令来通过ssh传输文件 1 从服务器上下载文件scp username servername path filename var www local dir 本地目录 例如scp root
  • supervisor托管配置nginx

    前言 阅读本文档前 请先了解如何安装配置supervisor和nginx 以下是相关学习文档 超全面 CentOS7 安装及配置supervisor CentOS 安装及配置nginx 配置 1 创建supervisor托管配置文件 详细如
  • oracle导库报959,IMP-00003: 遇到 ORACLE 错误 959

    导入前先要建好表空间和用户 建议你导出的时候按用户导出 不要用sys全部导出来还有在导入的时候需要指定导入到哪个用中去 给个操作手顺吧 我今天刚弄完的 1 导出 exp user user dbname owner user file pa
  • opencv之初学

    浅浅地记录一下自己学习opencv的过程吧 我有想毕业之后从事图像处理方面的工作 所以就从现在学起 争取明年秋招时能拿到offer吧 1 下载opencv opencv有很多的版本 我大概在网上搜了一下它的下载过程 需要在Visual St
  • UE4中文本文件配置文件Json文件XML文件的读写

    虚幻引擎中提供了与平台无关的文件读写与访问接口 通过调用 可以完成一些文件的读写 比如文本文件 配置文件 json文件 xml文件等 完成文件读写 首先需要获取文件路径等相关信息 对调用这些操作 我们需要包含头文件PlatformFilem