UE4 创建 JSON 文件:从基础到实践的完整指南**
在虚幻引擎(UE4)开发中,JSON(JavaScript Object Notation)因其轻量级、易读易写的特性,常被用于配置文件、数据存储、跨平台数据交换等场景,在UE4中创建和操作JSON文件是一项非常实用的技能,本文将详细介绍如何在UE4中创建JSON文件,涵盖从基础概念到具体代码实现的完整流程。
为什么在UE4中使用JSON?
在开始之前,我们先简单了解一下为什么要在UE4中使用JSON:
- 数据持久化:将游戏中的数据(如玩家设置、关卡进度、物品列表等)保存到JSON文件,以便下次游戏加载时恢复。
- 配置管理:用于管理游戏的各种参数,如敌人属性、技能效果、UI文本等,方便非程序员进行调整。
- 跨平台通信:JSON是通用格式,可以方便地在UE4与其他编程语言(如C++、Python、JavaScript)的应用程序之间交换数据。
- 易于调试:JSON文件是文本格式,可以直接用文本编辑器打开查看和修改,方便调试。
UE4中创建JSON文件的两种主要方式
在UE4中,创建JSON文件主要有两种方式:使用C++ API和使用蓝图(Blueprints),C++方式更灵活高效,适合复杂逻辑;蓝图方式则更直观,适合快速原型和简单操作。
使用C++创建JSON文件
UE4内置了强大的Json模块,基于RapidJSON库,提供了丰富的API来操作JSON数据。
步骤1:包含必要的头文件
在你的C++类文件中(一个继承自UUserObject或UActorComponent的类),需要包含以下头文件:
#include "Json.h" #include "JsonUtilities.h" // 包含一些实用的JSON工具函数,如TSharedPtr<TJsonReaderWriter> #include "JsonObjectConverter.h" // 用于将USTRUCT转换为JSON对象,反之亦然(可选,高级用法)
步骤2:创建JSON对象并填充数据
我们可以使用TSharedPtr<FJsonObject>来创建一个JSON对象,JSON对象由键(Key)和值(Value)对组成,值可以是字符串、数字、布尔值、数组,甚至是另一个JSON对象。
// 1. 创建一个JSON对象
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
// 2. 向JSON对象添加各种类型的键值对
JsonObject->SetStringField("PlayerName", "张三");
JsonObject->SetNumberField("PlayerLevel", 10);
JsonObject->SetBoolField("IsOnline", true);
JsonObject->SetStringField("LastLoginTime", "2023-10-27T10:30:00Z");
// 3. 添加一个子JSON对象
TSharedPtr<FJsonObject> InventoryObject = MakeShareable(new FJsonObject);
InventoryObject->SetStringField("Weapon", "Sword");
InventoryObject->SetNumberField("Count", 1);
JsonObject->SetObjectField("Inventory", InventoryObject);
// 4. 添加一个JSON数组
TArray<TSharedPtr<FJsonValue>> ItemArray;
TSharedPtr<FJsonValueString> Item1 = MakeShareable(new FJsonValueString("HealthPotion"));
TSharedPtr<FJsonValueString> Item2 = MakeShareable(new FJsonValueString("ManaPotion"));
ItemArray.Add(Item1);
ItemArray.Add(Item2);
JsonObject->SetArrayField("Items", ItemArray);
步骤3:将JSON对象序列化为字符串
要将创建的JSON对象写入文件,首先需要将其转换为字符串格式。
TSharedPtr<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString); FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter); JsonWriter->Close();
这里JsonString是一个FString变量,用于存储序列化后的JSON字符串。
步骤4:将JSON字符串写入文件
有了JSON字符串后,就可以使用UE4的文件I/O功能将其写入到本地文件,我们会将文件保存在Saved目录下,这样不会随着游戏安装包被覆盖。
FString JsonFilePath = FPaths::Combine(FPaths::ProjectDir(), "Saved/Config/PlayerData.json"); FFileHelper::SaveStringToFile(JsonString, *JsonFilePath);
完整C++示例代码片段(在一个Actor的某个函数中):
#include "YourActor.h"
#include "Json.h"
#include "FileHelper.h"
#include "Paths.h"
// YourActor.h
// UCLASS()
// class YOURPROJECT_API AYourActor : public AActor
// {
// GENERATED_BODY()
// public:
// UFUNCTION(BlueprintCallable, Category = "JSON|Save")
// void SavePlayerDataToJson();
// };
// YourActor.cpp
#include "YourActor.h"
void AYourActor::SavePlayerDataToJson()
{
// 1. 创建JSON对象
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
// 2. 填充数据
JsonObject->SetStringField("PlayerName", "JohnDoe");
JsonObject->SetNumberField("Score", 1000);
JsonObject->SetBoolField("HasUnlockable", false);
// 3. 序列化为字符串
FString JsonString;
TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString);
FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter);
JsonWriter->Close();
// 4. 写入文件
FString Directory = FPaths::Combine(FPaths::ProjectDir(), "Saved/MyJsonFiles");
if (!FPaths::DirectoryExists(Directory))
{
IFileManager::Get().MakeDirectory(*Directory, true);
}
FString JsonFilePath = FPaths::Combine(Directory, "PlayerSave.json");
if (FFileHelper::SaveStringToFile(JsonString, *JsonFilePath))
{
UE_LOG(LogTemp, Log, TEXT("JSON文件保存成功: %s"), *JsonFilePath);
}
else
{
UE_LOG(LogTemp, Error, TEXT("JSON文件保存失败: %s"), *JsonFilePath);
}
}
使用蓝图创建JSON文件
UE4也提供了蓝图节点来操作JSON,虽然没有C++那么灵活,但对于简单的JSON创建和写入非常方便。
步骤1:准备蓝图函数库
蓝图本身没有直接创建JSON对象的节点,通常我们会创建一个自定义的蓝图函数库(Blueprint Function Library)来封装C++的JSON操作,或者使用第三方插件,这里我们主要介绍基于官方Json模块的蓝图调用方式(如果通过C++暴露节点)。
假设我们已经有一个蓝图函数库,其中包含类似“Create JSON Object”、“Set String Field”、“Save JSON to File”等节点。
步骤2:在蓝图中创建JSON对象并填充数据
- 获取JSON对象:调用“Create JSON Object”节点,得到一个JSON对象引用。
- 添加键值对:使用“Set String Field”、“Set Number Field”、“Set Boolean Field”等节点,向JSON对象中添加数据,这些节点通常需要JSON对象引用、键名(字符串)和值作为输入。
- 创建子JSON对象/数组:同样,可以使用“Create JSON Object”创建子对象,然后添加到父对象中;使用“Create JSON Array”创建数组,并添加元素。
步骤3:将JSON对象转换为字符串并保存
- 序列化JSON:使用“JSON to String”节点(或类似名称),将JSON对象转换为JSON字符串。
- 确定保存路径:使用“Project Saved Directory”节点获取游戏保存目录,然后拼接文件名,得到完整的文件路径。
- 保存文件:使用“Save String to File”节点(或类似名称),输入JSON字符串和文件路径,即可将JSON文件保存到指定位置。
注意:UE4官方蓝图节点对JSON的支持相对有限,直接操作可能不如C++方便,开发者常常会编写自定义的C++函数库来暴露更友好的蓝图节点,或者使用社区中成熟的JSON蓝图插件(如“Blueprint Json”等,这些插件通常提供了更丰富的蓝图节点来创建、解析、修改JSON)。
最佳实践与注意事项
- 文件路径:尽量使用
FPaths::Combine来构建文件路径,确保跨平台兼容性,将用户数据保存在Saved目录下是个好习惯。 - 错误处理:在写入文件时,最好检查文件是否成功创建和写入,例如
FFileHelper::SaveStringToFile会返回一个布尔值表示成功与否。 - 数据结构:如果需要将复杂的USTRUCT数据转换为JSON,可以考虑使用
JsonObjectConverter类,它提供了将USTRUCT序列化为JSON和从JSON反序列化为USTRUCT的静态方法,能大大简化开发。 - 性能考虑:对于频繁的JSON读写操作,需要注意性能影响,C++方式通常比蓝图方式效率更高。
- 编码:确保JSON文件使用UTF-8编码,这是最通用的



还没有评论,来说两句吧...