目录
前言
有时候我们会获取到如下形式的Json,其中Data字段的内容经过字符串化处理。本篇文章介绍如何读写这种形式的Json。

步骤
一、写入
cpp
void ASampleJson::WriteBadJson()
{
// 创建主JSON对象
TSharedPtr<FJsonObject> MainJsonObject = MakeShareable(new FJsonObject());
// 添加基本类型字段
MainJsonObject->SetNumberField("Code", 998);
MainJsonObject->SetStringField("Message", "Success");
// 创建内部JSON对象
TSharedPtr<FJsonObject> InnerJsonObject = MakeShareable(new FJsonObject());
InnerJsonObject->SetStringField("ServerName", "ZhiChao");
InnerJsonObject->SetNumberField("ServerVersion", 1.0f);
// 将内部JSON对象序列化为紧凑格式的字符串
FString InnerJsonString;
TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> InnerJsonWriter
= TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&InnerJsonString);
FJsonSerializer::Serialize(InnerJsonObject.ToSharedRef(), InnerJsonWriter);
InnerJsonWriter->Close();
// 将内部JSON字符串添加到主JSON对象的Data字段
MainJsonObject->SetStringField("Data", InnerJsonString);
// 将主JSON对象序列化为最终的JSON字符串
FString FinalJsonString;
TSharedRef<TJsonWriter<>> FinalJsonWriter = TJsonWriterFactory<>::Create(&FinalJsonString);
FJsonSerializer::Serialize(MainJsonObject.ToSharedRef(), FinalJsonWriter); //将JSON对象InnerJsonObject序列化为字符串
FinalJsonWriter->Close();
FString FilePath = FPaths::ProjectSavedDir() / TEXT("BadJson.json");
if (FFileHelper::SaveStringToFile(FinalJsonString, *FilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM))
{
UE_LOG(LogTemp, Warning, TEXT("JSON 文件保存成功: %s"), *FilePath);
}
else
{
UE_LOG(LogTemp, Error, TEXT("JSON 文件保存失败: %s"), *FilePath);
}
}
最关键的部分是将Json对象序列化为字符串

二、读取
cpp
void ASampleJson::ReadBadJson()
{
//从文件中获取Json字符串
FString JsonFilePath = FPaths::ProjectSavedDir() / TEXT("BadJson.json");
FString JsonString = TEXT("");
FFileHelper::LoadFileToString(JsonString, *JsonFilePath);
//通过Json字符串构建Json对象
TSharedPtr<FJsonObject> JsonObject;
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonString); //创建JSON读取器
FJsonSerializer::Deserialize(JsonReader, JsonObject); //使用JSON序列化器将JsonString解析为JsonObject
//解析Json
int32 Code = JsonObject->GetNumberField(TEXT("Code"));
FString Message = JsonObject->GetStringField(TEXT("Message"));
FString Data = JsonObject->GetStringField(TEXT("Data"));
TSharedPtr<FJsonObject> DataJsonObject;
TSharedRef<TJsonReader<TCHAR>> DataJsonReader = TJsonReaderFactory<TCHAR>::Create(Data);
FJsonSerializer::Deserialize(DataJsonReader, DataJsonObject);
FString ServerName = DataJsonObject->GetStringField(TEXT("ServerName"));
float ServerVersion = DataJsonObject->GetNumberField(TEXT("ServerVersion"));
}
其中最关键的部分是将Json字符串转化为Json对象
