1:添加JSON Modules
在Project.Build.cs文件中的PrivateDependencyModuleNames添加Json和JsonUtilities模块。
读取Json文件到字符串
private:
bool LoadStringFromFile(const FString& FileName, const FString& RelaPath, FString& ResultString);
bool SlAiJsonHandle::LoadStringFromFile(const FString& FileName, const FString& RelaPath, FString& ResultString)
{
if (!FileName.IsEmpty()) {
//获取绝对路径 (GameContent+相对路径+文件名)
FString AbsoPath = FPaths::GameContentDir() + RelaPath + FileName;
//判断文件是否存在文件
if (FPaths::FileExists(AbsoPath))
{
if (FFileHelper::LoadFileToString(ResultString, *AbsoPath))
{
return true;
}
else {
//加载不成功
SlAiHelper::Debug(FString("Load Error") + AbsoPath);
}
}
else {
//输出文件不存在
SlAiHelper::Debug(FString("File Not Exist") + AbsoPath);
}
}
return false;
}
解析存档方法 (读取到的json文件按内容,传入方法)
void RecordDataJsonRead(FString& Culture, float& MusicVolume, float& SoundVolume, TArray<FString>& RecordDataList);
void SlAiJsonHandle::RecordDataJsonRead(FString& Culture, float& MusicVolume, float& SoundVolume, TArray<FString>& RecordDataList)
{
//用于保存file读取的内容
FString JsonValue;
//载入
LoadStringFromFile(RecordDataFileName, RelativePath, JsonValue);
//保存解析出来的数据
TArray<TSharedPtr<FJsonValue>> JsonParsed;
//将JsonValue字符串中读取到JsonReader
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonValue);
//解析。。
//将解析的内容保存到数组
if (FJsonSerializer::Deserialize(JsonReader, JsonParsed))
{
//获取数据
Culture = JsonParsed[0]->AsObject()->GetStringField(FString("Culture"));
MusicVolume = JsonParsed[1]->AsObject()->GetNumberField(FString("MusicVolume"));
SoundVolume = JsonParsed[2]->AsObject()->GetNumberField(FString("SoundVolume"));
//获取存档数据
TArray<TSharedPtr<FJsonValue>> RecordDataArray = JsonParsed[3]->AsObject()->GetArrayField(FString("RecordData"));
for (int i = 0; i < RecordDataArray.Num(); ++i)
{
FString RecordDataName = RecordDataArray[i]->AsObject()->GetStringField(FString::FromInt(i));
RecordDataList.Add(RecordDataName);
}
}
else
{
SlAiHelper::Debug(FString("Deserialize Failed"));
}
}
初始化存档数据
private:
//初始化存档数据
void InitRecordData();
void SlAiDataHandle::InitRecordData()
{
//RecordName = FString("");
//获取语言
FString Culture;
//读取存档数据
SlAiSingleton<SlAiJsonHandle>::Get()->RecordDataJsonRead(Culture, MusicVolume, SoundVolume, RecordDataList);
//初始化语言
ChangeLocalizationCulture(GetEnumValueFromString<ECultureTeam>(FString("ECultureTeam"), Culture));
}
把数据写入Json文件
保存字符串到文件
private:
bool WriteFileWithJsonData(const FString& JsonStr, const FString& RelaPath, const FString& FileName);
bool SlAiJsonHandle::WriteFileWithJsonData(const FString& JsonStr, const FString& RelaPath, const FString& FileName)
{
if (!JsonStr.IsEmpty()) //字符串是否为空?
{
if (!FileName.IsEmpty()) //文件名是否为空?
{
FString AbsoPath = FPaths::GameContentDir() + RelaPath + FileName;
//保存
if (FFileHelper::SaveStringToFile(JsonStr, *AbsoPath))
{
return true;
}
else
{
SlAiHelper::Debug(FString("Save") + AbsoPath + FString("-->Failed"), 10.f);
}
}
}
return false;
}
FJsonObject转换为Json格式的字符串
private:
bool GetFStringInJsonData(const TSharedPtr<FJsonObject>& JsonObj, FString& JsonStr);
bool SlAiJsonHandle::GetFStringInJsonData(const TSharedPtr<FJsonObject>& JsonObj, FString& JsonStr)
{
if (JsonObj.IsValid() && JsonObj->Values.Num() > 0)
{
//写入
TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<TCHAR>::Create(&JsonStr);
FJsonSerializer::Serialize(JsonObj.ToSharedRef(), JsonWriter);
return true;
}
return false;
}
修改存档数据
public:
//修改存档
void UpdateRecordData(FString Culture, float MusicVolume, float SoundVolume, TArray<FString>* RecordDataList);
void SlAiJsonHandle::UpdateRecordData(FString Culture, float MusicVolume, float SoundVolume, TArray<FString>* RecordDataList)
{
//将数据转换为JsonObject
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
TArray<TSharedPtr<FJsonValue>> BaseDataArray;
//填充数组1.2.3
TSharedPtr<FJsonObject> CultureObject = MakeShareable(new FJsonObject);
CultureObject->SetStringField("Culture", Culture);
TSharedPtr<FJsonValueObject> CultureValue = MakeShareable(new FJsonValueObject(CultureObject)); //转换为JsonValue存入
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); //转换为JsonValue存入
RecordItem->SetStringField(FString::FromInt(i), (*RecordDataList)[i]);
TSharedPtr<FJsonValueObject> RecordDataValue = MakeShareable(new FJsonValueObject(RecordItem));
RecordDataArray.Add(RecordDataValue); //添加进数组
}
//添加一个key
TSharedPtr<FJsonObject> RecordDataObject = MakeShareable(new FJsonObject);
RecordDataObject->SetArrayField("RecordData", RecordDataArray);
TSharedPtr<FJsonValueObject> RecordDataValue = MakeShareable(new FJsonValueObject(RecordDataObject));
//添加进数组BaseDataArray
BaseDataArray.Add(CultureValue);
BaseDataArray.Add(MusicVolumeValue);
BaseDataArray.Add(SoundVolumeValue);
BaseDataArray.Add(RecordDataValue);
JsonObject->SetArrayField("T", BaseDataArray);
//将json转为字符串
FString JsonStr;
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);
}
最后当更新数据狗调用
//更新存档数据 需要将枚举类型转换为字符串类型(1,UE反射方法,2,普通c++方法)
SlAiSingleton<SlAiJsonHandle>::Get()->UpdateRecordData(GetEnumValueAsString<ECultureTeam>(FString("ECultureTeam"), CurrentCulture),MusicVolume, SoundVolume, &RecordDataList);
来源:CSDN
作者:一个有态度的槛内人
链接:https://blog.csdn.net/weixin_43958768/article/details/104348725