十一、写入存档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"});

猜你喜欢

转载自blog.csdn.net/m0_51032168/article/details/121484952