UE中如何将JSON数据转换为单行显示:实用技巧与代码实现
在Unreal Engine(UE)开发中,JSON数据常用于配置文件、网络通信或数据存储,默认情况下,JSON数据往往以格式化的多行形式呈现(带缩进和换行),这在某些场景下(如日志输出、网络传输或存储优化)可能不够高效,本文将详细介绍如何在UE中将JSON数据转换为单行字符串,涵盖核心API使用、代码示例及常见问题解决。
为什么需要将JSON转为单行?
在正式实现前,先明确单行JSON的应用场景:
- 网络传输优化:减少数据包体积,提升传输效率;
 - 日志存储:避免多行日志占用过多存储空间,便于日志解析;
 - 配置文件简洁性:某些小型配置场景需要紧凑的数据格式;
 - UI显示限制:如文本框控件宽度有限,需单行展示完整JSON。
 
UE中JSON处理的核心类
UE的JSON功能主要通过JsonUtilities模块实现,核心类包括:  
TSharedPtr<FJsonObject>:表示JSON对象,支持键值对操作;TJsonWriterFactory:JSON写入器工厂,用于将JSON对象序列化为字符串;TJsonStringWriter:基于字符串的写入器,支持配置输出格式(如是否缩进、换行)。
将JSON转为单行的核心方法:禁用缩进与换行
JSON序列化为字符串时,可通过写入器的SetIndentation或配置参数控制格式,要实现单行输出,核心是禁用缩进(缩进设为0)并保留换行符为空,以下是具体实现步骤。
准备JSON数据
假设我们有一个JSON对象(或从文件/字符串解析而来),
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
JsonObject->SetStringField("name", "UE开发者");
JsonObject->SetNumberField("level", 10);
JsonObject->SetBoolField("isActive", true);
JsonObject->SetArrayField("skills", TArray<TSharedPtr<FJsonValue>>{
    MakeShareable(new FJsonValueString("C++")),
    MakeShareable(new FJsonValueString("蓝图")),
    MakeShareable(new FJsonValueString("JSON"))
});
使用TJsonStringWriter序列化为单行字符串
通过TJsonStringWriter的SetIndentation方法将缩进设置为0,即可输出无缩进、无换行的单行JSON:  
#include "Json.h"  // 包含JSON相关头文件
#include "JsonWriter.h"  // 包含写入器头文件
FString JsonString;
TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonStringWriter<TCHAR>::Create(&JsonString);
JsonWriter->SetIndentation(0);  // 关键:禁用缩进,单行输出
// 将JSON对象写入写入器
bool bSuccess = FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter);
if (bSuccess) {
    // JsonString即为单行JSON
    UE_LOG(LogTemp, Log, TEXT("单行JSON: %s"), *JsonString);
    // 输出示例: {"name":"UE开发者","level":10,"isActive":true,"skills":["C++","蓝图","JSON"]}
} else {
    UE_LOG(LogTemp, Error, TEXT("JSON序列化失败"));
}
替代方案:使用TJsonWriterFactory的Create方法
如果需要更灵活的格式控制,可通过TJsonWriterFactory直接创建无缩进的写入器:  
FString JsonString;
TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<TCHAR>::Create(&JsonString, 0);  // 0表示无缩进
bool bSuccess = FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter);
if (bSuccess) {
    UE_LOG(LogTemp, Log, TEXT("单行JSON: %s"), *JsonString);
}
处理从文件/字符串加载的JSON
如果JSON数据来自文件或字符串(如从网络接收的格式化JSON),需先解析为TSharedPtr<FJsonObject>,再按上述方法序列化为单行。  
示例:从字符串解析并转为单行
FString OriginalJson = R"(
{
    "name": "UE开发者",
    "level": 10,
    "isActive": true,
    "skills": ["C++", "蓝图", "JSON"]
}
)";
// 解析为JSON对象
TSharedPtr<FJsonObject> JsonObject;
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(OriginalJson);
bool bParsed = FJsonSerializer::Deserialize(JsonReader, JsonObject);
if (bParsed && JsonObject.IsValid()) {
    // 序列化为单行
    FString CompactJsonString;
    TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonStringWriter<TCHAR>::Create(&CompactJsonString);
    JsonWriter->SetIndentation(0);
    FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter);
    UE_LOG(LogTemp, Log, TEXT("原始JSON:\n%s\n单行JSON:\n%s"), *OriginalJson, *CompactJsonString);
}
常见问题与解决
序列化后仍有多行/缩进?
原因:未正确调用SetIndentation(0)或使用了默认的写入器(如TJsonWriter未配置缩进)。
解决:确保在创建写入器后显式设置缩进为0,并检查是否使用了TJsonStringWriter或TJsonWriterFactory的正确参数。
中文或特殊字符乱码?
原因:JSON字符串编码问题(如未使用UTF-8)。
解决:UE默认使用UTF-8编码,但如果输入字符串编码不一致,需先转换编码,可通过FCString::ConvertTCHARToUTF8或FUTF8ToTCHAR处理:  
FString UnicodeString = "测试JSON";
FString JsonString;
TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonStringWriter<TCHAR>::Create(&JsonString, 0);
JsonWriter->SetStringField("text", UnicodeString);
FJsonSerializer::Serialize(MakeShareable(new FJsonObject()), JsonWriter);  // 假设写入到简单对象
复杂嵌套JSON如何处理?
嵌套JSON(对象内嵌对象或数组)同样适用上述方法,SetIndentation(0)会递归禁用所有层级的缩进和换行:  
TSharedPtr<FJsonObject> NestedObject = MakeShareable(new FJsonObject());
NestedObject->SetStringField("key", "value");
TSharedPtr<FJsonObject> RootObject = MakeShareable(new FJsonObject());
RootObject->SetObjectField("nested", NestedObject);
FString JsonString;
TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonStringWriter<TCHAR>::Create(&JsonString, 0);
FJsonSerializer::Serialize(RootObject.ToSharedRef(), JsonWriter);
// 输出: {"nested":{"key":"value"}}
在UE中将JSON数据转为单行,核心是通过TJsonStringWriter或TJsonWriterFactory创建写入器时,将缩进参数设置为0,具体步骤可归纳为:  
- 准备JSON数据(直接创建或从文件/字符串解析);
 - 创建写入器并禁用缩进(
SetIndentation(0)); - 使用
FJsonSerializer::Serialize序列化为字符串。 
此方法适用于所有JSON场景,包括简单键值对、嵌套对象和数组,能有效实现数据格式的紧凑化,满足网络传输、日志存储等需求。
通过以上技巧,开发者可以轻松在UE中处理JSON格式化问题,提升开发效率和代码可维护性。



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