十一、写入存档Json文件
对Json文件的处理
SlAiJsonHandle.h
...
public:
//修改存档
void UpdateRecordData(FString Culture, float MusicVolume, float SoundVolume, TArray<FString>* RecordDataList);
private:
...
//FJsonObject转换为Json格式的字符串
bool GetFStringInJsonData(const TSharedPtr<FJsonObject>& JsonObj, FString& JsonStr);
//保存字符串到文件
bool WriteFileWithJsonData(const FString& JsonStr, const FString& RelaPath, const FString& FileName);
private:
//存档文件名
FString RecordDataFileName;
//相对路径
FString RelativePath;
};
SlAiJsonHandle.cpp
#include "SlAiJsonHandle.h"
#include"SlAiHelper.h"
SlAiJsonHandle::SlAiJsonHandle()
{
RecordDataFileName = FString("RecordData.json");
RelativePath = FString("Res/ConfigData/");
}
...
//传入的数据转化为Json格式,Json格式转化为Json字符串,然后去掉多余的字符,再写入文件
void SlAiJsonHandle::UpdateRecordData(FString Culture, float MusicVolume, float SoundVolume, TArray<FString>* RecordDataList)
{
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
TArray<TSharedPtr<FJsonValue>> BaseDataArray;
//Json 对象是一个结构,包含一组无序的名称/值对。
// 在 Json 文件中,它由大括号 {} 之间的所有内容表示。
TSharedPtr<FJsonObject> CultureObject = MakeShareable(new FJsonObject);
//添加一个名为 Culture 的字段,值为 Culture("ZH"or"EN")
CultureObject->SetStringField("Culture", Culture);
//CultureValue 一个 Json 对象值。
TSharedPtr<FJsonValueObject> CultureValue = MakeShareable(new FJsonValueObject(CultureObject));
//同上
TSharedPtr<FJsonObject> MusicVolumeObject = MakeShareable(new FJsonObject);
MusicVolumeObject->SetNumberField("MusicVolume", MusicVolume);
TSharedPtr<FJsonValueObject> MusicVolumeValue = MakeShareable(new FJsonValueObject(MusicVolumeObject));
TSharedPtr<FJsonObject> SoundVolumeObject = MakeShareable(new FJsonObject);
SoundVolumeObject->SetNumberField("SoundVolume", SoundVolume);
TSharedPtr<FJsonValueObject> SoundVolumeValue = MakeShareable(new FJsonValueObject(SoundVolumeObject));
TArray<TSharedPtr<FJsonValue>> RecordDataArray;
for (int i = 0; i < RecordDataList->Num(); ++i)
{
TSharedPtr<FJsonObject> RecordItem = MakeShareable(new FJsonObject);
RecordItem->SetStringField(FString::FromInt(i),(*RecordDataList)[i]);
TSharedPtr<FJsonValueObject> RecordDataValue = MakeShareable(new FJsonValueObject(RecordItem));
RecordDataArray.Add(RecordDataValue);
}
TSharedPtr<FJsonObject> RecordDataObject = MakeShareable(new FJsonObject);
RecordDataObject->SetArrayField("RecordData", RecordDataArray);
TSharedPtr<FJsonValueObject> RecordDataValue = MakeShareable(new FJsonValueObject(RecordDataObject));
BaseDataArray.Add(CultureValue);
BaseDataArray.Add(MusicVolumeValue);
BaseDataArray.Add(SoundVolumeValue);
BaseDataArray.Add(RecordDataValue);
//设置一个名为T的数组字段和BaseDataArray的值
JsonObject->SetArrayField("T", BaseDataArray);
FString JsonStr;
//FJsonObject转换为Json格式的字符串
GetFStringInJsonData(JsonObject, JsonStr);
SlAiHelper::Debug(FString("Origin Str: " + JsonStr), 60.f);
//去掉多余的字符
JsonStr.RemoveAt(0, 8);
JsonStr.RemoveFromEnd(FString("}"));
SlAiHelper::Debug(FString("Final Str: " + JsonStr), 60.f);
//写入文件
WriteFileWithJsonData(JsonStr, RelativePath, RecordDataFileName);
}
...
//FJsonObject转换为Json格式的字符串
bool SlAiJsonHandle::GetFStringInJsonData(const TSharedPtr<FJsonObject>& JsonObj, FString& JsonStr)
{
if (JsonObj.IsValid() && JsonObj->Values.Num() > 0)
{
TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<TCHAR>::Create(&JsonStr);
//看源码
//FJsonObject转换为Json格式的字符串
FJsonSerializer::Serialize(JsonObj.ToSharedRef(), JsonWriter);
return true;
}
return false;
}
//保存字符串到文件
bool SlAiJsonHandle::WriteFileWithJsonData(const FString& JsonStr, const FString& RelaPath, const FString& FileName)
{
if (!JsonStr.IsEmpty())
{
if (!FileName.IsEmpty())
{
FString Absopath = FPaths::ProjectContentDir() + RelaPath + FileName;
//保存
//将 JsonStr写入文件。
if (FFileHelper::SaveStringToFile(JsonStr, *Absopath))
{
return true;
}
else
{
SlAiHelper::Debug(FString("Save") + Absopath + FString("--->Failed"), 10.f);
}
}
}
return false;
}
处理数据
SlAiDataHandle.h
...
public:
...
//存档数据
TArray<FString> RecordDataList;
...
};
...
void SlAiDataHandle::ChangeLocalzationCulture(ECultureTeam Culture)
{
...
//更新存档数据
SlAiSingleton<SlAiJsonHandle>::Get()->UpdateRecordData(GetEnumValueAsString<ECultureTeam>(FString("ECultureTeam"),
CurrentCulture), MusicVolume, SoundVolume, &RecordDataList);
}
void SlAiDataHandle::ResetMenuVolume(float MusicVal, float SoundVal)
{
...
//更新存档数据
SlAiSingleton<SlAiJsonHandle>::Get()->UpdateRecordData(GetEnumValueAsString<ECultureTeam>(FString("ECultureTeam"),
CurrentCulture), MusicVolume, SoundVolume, &RecordDataList);
}
...
注意
FJsonObject转换为Json格式的字符串
//设置一个名为T的数组字段和BaseDataArray的值
JsonObject->SetArrayField("T", BaseDataArray);
FString JsonStr;
//FJsonObject转换为Json格式的字符串
GetFStringInJsonData(JsonObject, JsonStr);
"{
"T":[
{
"Culture": "EN"
},
{
"MusicVolume": 0.69551545381546021
},
{
"SoundVolume": 0.10008163750171661
},
{
"RecordData": [
{
"0": "Default"
},
{
"1": "RecordOne"
}
]
}
]
}"
写入的字符串
//去掉多余的字符
JsonStr.RemoveAt(0, 8); //外加两个'\n'
JsonStr.RemoveFromEnd(FString("}"));
" [
{
"Culture": "EN"
},
{
"MusicVolume": 0.69551545381546021
},
{
"SoundVolume": 0.10008163750171661
},
{
"RecordData": [
{
"0": "Default"
},
{
"1": "RecordOne"
}
]
}
]"
修改语言和调整音量时会更新数据
(传入的参数转化为Json格式,Json格式转化为Json字符串,然后去掉多余的字符,再写入文件)
UpdateRecordData(GetEnumValueAsString<ECultureTeam>(FString("ECultureTeam"),
CurrentCulture), MusicVolume, SoundVolume, &RecordDataList);
//UpdateRecordData("EN",0.7,0.1,{"Default","RecordOne"});