读取磁盘中的JSON文件
//解析JSON文件
//如何读取磁盘文件
FString JsonStr;
if(FFileHelper::LoadFileToString(JsonStr,TEXT("D:\\Unreal Projects\\UECPP\\Poniter\\Content\\Data\\1.json")))
{
//通过解析工厂创建解析阅读器
TSharedRef<TJsonReader<>> JsonReade= TJsonReaderFactory<>::Create(JsonStr);
//创建用于接收的UE的Json对象
TSharedPtr<FJsonObject> JsonObject;
//通过序列化工具进行反序列化,序列化一般指,将内存数据结构转换为其他数据结构
if(FJsonSerializer::Deserialize(JsonReade,JsonObject))
{
//以下是对文件数据的处理
TArray<TSharedPtr<FJsonValue>> JsonObjects = JsonObject->GetArrayField(TEXT("person"));
TSharedPtr<FJsonObject> teacher = JsonObjects[0]->AsObject();
TArray<TSharedPtr<FJsonValue>> teachers = teacher->GetArrayField(TEXT("teachers"));
TSharedPtr<FJsonObject> teacherobj = teachers[0]->AsObject();
TSharedPtr<FJsonObject> zhang = teacherobj->GetObjectField(TEXT("zhang"));
TArray<TSharedPtr<FJsonValue>> Zhangs = zhang->GetArrayField(TEXT("hobby"));
for (auto item:Zhangs)
{
UE_LOG(LogTemp, Log, TEXT("ok%s"),*item->AsString())
}
}
}
对磁盘中的JSON文件数据进行修改
序列化JSON对象(将JSON对象转为字符串)
注:序列化一般指,将内存中的数据结构转为其他数据结构
//序列化JSON
TSharedPtr<FJsonObject> ptr(new FJsonObject);
ptr->SetStringField(TEXT("name"),TEXT("张三"));
ptr->SetNumberField(TEXT("age"),12);
ptr->SetBoolField(TEXT("Student"),true);
//构建书写器
FString str;
TSharedRef<TJsonWriter<>> JsonWrite = TJsonWriterFactory<>::Create(&str);
if(FJsonSerializer::Serialize(ptr.ToSharedRef(),JsonWrite))
{
UE_LOG(LogTemp, Log, TEXT("ok%s"),*str)
}
序列化JSON数组(将JSON数组转为字符串)
TArray<TSharedPtr<FJsonValue>> Prr;
Prr.Add(MakeShareable(new FJsonValueString(TEXT("文本"))));
Prr.Add(MakeShareable(new FJsonValueBoolean(true)));
TArray<TSharedPtr<FJsonValue>> ptr;
ptr.Add(MakeShareable(new FJsonValueString(TEXT("哈哈"))));
Prr.Add(MakeShareable(new FJsonValueArray(ptr)));
TSharedPtr<FJsonObject>prtobj(new FJsonObject);
prtobj->SetNumberField(TEXT("age"),12);
Prr.Add(MakeShareable(new FJsonValueObject(prtobj)));
//构建书写器
FString str;
TSharedRef<TJsonWriter<>> write = TJsonWriterFactory<>::Create(&str);
if(FJsonSerializer::Serialize(Prr,write))
{
UE_LOG(LogTemp, Log, TEXT("%s"),*str)
}
将JSON数据存储至文件中
//这里以将场景中的actor名字保存在一个文件中为例
//创建JSON类型的数组
TArray<TSharedPtr<FJsonValue>> Array;
//创建存储Actor的数组
TArray<AActor*>ActorArray;
//获取所有actor
UGameplayStatics::GetAllActorsOfClass(this,AActor::StaticClass(),ActorArray);
//遍历将actor的名称加至JSON数组中
for(auto item:ActorArray)
{
TSharedPtr<FJsonObject>obj(new FJsonObject);
obj->SetStringField(TEXT("name"),item->GetName());
Array.Add(MakeShareable(new FJsonValueObject(obj)));
}
//创建用于接收的字符串
FString str;
//构建书写器
TSharedRef<TJsonWriter<>>val = TJsonWriterFactory<>::Create(&str);
//进行序列化
if(FJsonSerializer::Serialize(Array,val))
{
//保存至文件中
FFileHelper::SaveStringToFile(str,TEXT("D:\\UnrealProjects\\UECPP\\Poniter\\Content\\Data\\2.json"));
}