目录
方式一(不推荐)
方式二(推荐)
一、生成普通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 处理相关的头文件,其中:
#include "Policies/CondensedJsonPrintPolicy.h"
:、包含了FCondensedJsonPrintPolicy
,该策略用于以紧凑格式打印 JSON 数据,也就是去掉不必要的空格和换行符,使 JSON 字符串更为精简。#include "Serialization/JsonWriter.h"
:包含了用于将 JSON 对象序列化为字符串的FJsonWriter
类。你能够用它把FJsonObject
转化为 JSON 字符串。#include "Serialization/JsonReader.h"
:包含了用于将 JSON 字符串反序列化为 JSON 对象的FJsonReader
类。你可以用它把 JSON 字符串解析成FJsonObject
。#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);
}