虚幻引擎:UEC++如何对JSON文件进行读写?

读取磁盘中的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"));
	}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ling…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值