UE5 读写本地JSON,发送HTTP请求(get)

news2024/11/24 19:42:43

UE5 读写本地JSON,发送HTTP请求(get)

没有使用插件,就用UE提供的库开发(推荐使用插件VaRest在虚幻商城里有)

		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "EnhancedInput" ,"Json","JsonUtilities","HTTP","HttpServer"});

读写本地JSON

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

USTRUCT(BlueprintType)
struct FMyJson : public FTableRowBase
{
	GENERATED_BODY()
	UPROPERTY(EditAnywhere, BlueprintReadWrite, DisplayName="timeStr") 
	FString TimeStr;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, DisplayName="Key1") 
	TArray<FString> Key1;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, DisplayName="Key2") 
	TArray<FString> Key2;
};

UCLASS(Blueprintable)
class UE_IVREAL_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable,meta=(WorldContext="WorldContextObject"))
	static void GetJSONStr(FString &jsonStr,const UObject* WorldContextObject);

	UFUNCTION(BlueprintCallable,meta=(WorldContext="WorldContextObject"))
	static void SetJSONStr(FString jsonStr,const UObject* WorldContextObject);
	
	UFUNCTION(BlueprintCallable,meta=(WorldContext="WorldContextObject"))
	static void DuJson(FString jsonStr,const UObject* WorldContextObject,FMyJson &OutMyJson);
	
	UFUNCTION(BlueprintCallable,meta=(WorldContext="WorldContextObject"))
	static void XieJson(FString &outjsonStr,const UObject* WorldContextObject,FMyJson MyJson);
}

void UMyBlueprintFunctionLibrary::GetJSONStr(FString& jsonStr, const UObject* WorldContextObject)
{
	FString RelaPath="JSON/";//相对路径
	FString FileName="yyy.json";//Json文件名
	FString ResultString;//存放读取结果的字符串
	FString AbsolutePath = FPaths::ProjectContentDir() + RelaPath + FileName;
	//UE_LOG(LogTemp,Warning,TEXT("%s"),*AbsolutePath);
	FFileHelper::LoadFileToString(ResultString, *AbsolutePath);//传入结果字符串和绝对路径
	jsonStr=ResultString;
}

void UMyBlueprintFunctionLibrary::SetJSONStr(FString jsonStr, const UObject* WorldContextObject)
{
	FString RelaPath="JSON/";//相对路径
	FString FileName="yyy.json";//Json文件名
	FString AbsolutePath = FPaths::ProjectContentDir() + RelaPath + FileName;
	//UE_LOG(LogTemp,Warning,TEXT("%s"),*AbsolutePath);
	FFileHelper::SaveStringToFile(jsonStr, *AbsolutePath);//传入结果字符串和绝对路径
}

void UMyBlueprintFunctionLibrary::DuJson(FString jsonStr, const UObject* WorldContextObject,FMyJson &OutMyJson)
{
	FMyJson MyJson;
	//GetJSONStr(jsonStr,WorldContextObject);
	// 创建一个Json 阅读器
	TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<TCHAR>::Create(jsonStr);

	// 创建一个Json对象
	TSharedPtr<FJsonObject> JsonObject;

	// 反序列化,将JsonReader里面的数据,传到JsonObject中
	FJsonSerializer::Deserialize(JsonReader, JsonObject);
	
	// 读取单体数据(假设Json数据里有:Time,单条数据)
	FString timeStr = JsonObject->GetStringField("Time");
	MyJson.TimeStr=timeStr;
	//UE_LOG(LogTemp,Warning,TEXT("Time= %s"),*timeStr);
	
	// 读取数组数据(假设Json数据里有:Data,数组数据)
	TArray<TSharedPtr<FJsonValue>> data = JsonObject->GetArrayField("Data");
	for(int i = 0; i < data.Num(); i++)
	{
		FString dataStr = data[i]->AsObject()->GetStringField("key1");
		FString dataStr1 = data[i]->AsObject()->GetStringField("key2");
		MyJson.Key1.Add(dataStr);
		MyJson.Key2.Add(dataStr1);
		//UE_LOG(LogTemp,Warning,TEXT("key1= %s"),*dataStr);
		//UE_LOG(LogTemp,Warning,TEXT("key2= %s"),*dataStr1);
	}
	OutMyJson=MyJson;
}

void UMyBlueprintFunctionLibrary::XieJson(FString &outjsonStr, const UObject* WorldContextObject, FMyJson MyJson)
{
	// 声明一个存储Json内容的字符串
	FString JsonStr;
	//GetJSONStr(JsonStr,WorldContextObject);

	// 创建一个Json编写器
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);

	// 声明Json对象写入开始
	JsonWriter->WriteObjectStart();
	JsonWriter->WriteValue(TEXT("Time"), MyJson.TimeStr);

	// 声明Json数组写入开始
	JsonWriter->WriteArrayStart(TEXT("Data"));
	for (int i = 0; i < MyJson.Key1.Num(); i++)
	{
		JsonWriter->WriteObjectStart();
		JsonWriter->WriteValue(TEXT("key1"), MyJson.Key1[i]);
		JsonWriter->WriteValue(TEXT("key2"), MyJson.Key2[i]);
		JsonWriter->WriteObjectEnd();
	}
	JsonWriter->WriteArrayEnd();
	
	JsonWriter->WriteObjectEnd();
	// 停止写入
	JsonWriter->Close();
	
	UE_LOG(LogTemp,Warning,TEXT("%s"),*JsonStr);
	outjsonStr=JsonStr;
}

在这里插入图片描述

发送HTTP请求(get)

这个请求是获取某个位置的天气,并获取返回JSON中的值,读取出来。
apispace
在这里插入图片描述

可以先用POSTMan先测试
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


UCLASS(Blueprintable)
class UE_IVREAL_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere,BlueprintReadOnly)
	FString CurrentF;
	UPROPERTY(EditAnywhere,BlueprintReadOnly)
	FString CurrentTQ;
	
	FHttpServerModule* HttpServerInstance;
	UFUNCTION(BlueprintCallable,meta=(WorldContext="WorldContextObject"))
	void text();
	
	void RequestComplete(FHttpRequestPtr RequestPtr, FHttpResponsePtr ResponsePtr, bool bIsSuccess);

	DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnBossDiedDelegate);
	UPROPERTY(BlueprintAssignable,EditAnywhere)
	FOnBossDiedDelegate FOK;
	
};



void UMyBlueprintFunctionLibrary::text()
{
	//如果是POST就要传给JSON过去,这里我们是GET
	/*FString server_data;
	// 创建json
	// TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(server_data);
	TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&server_data);
	 //开启json 写入
	JsonWriter->WriteObjectStart();
	//写入数据
	//JsonWriter->WriteValue("Content-Type", "application/json;charset=UTF-8");
	//关闭写入
   JsonWriter->WriteObjectEnd();
	//关闭Json 写入
   JsonWriter->Close();*/
	
	// 创建Http 请求
	TSharedRef<IHttpRequest> Request = FHttpModule::Get().CreateRequest();
	// 设置请求头
	Request->SetHeader("Content-Type","application/json;charset=UTF-8");
	Request->SetHeader("X-APISpace-Token","******");//这里要你的Key
	Request->SetHeader("Authorization-Type","apikey");
	//Request->SetHeader("Host","<calculated when request is sent>");
	// 设置请求方式
	Request->SetVerb(TEXT("GET"));
	// 请求的链接
	Request->SetURL("https://eolink.o.apispace.com/456456/weather/v001/now?areacode=101010100"); // 服务端预留的测试接口
	// 内容包
	//Request->SetContentAsString(server_data);
	//UE_LOG(LogTemp,Warning,TEXT("%s"),*server_data);
	
	// 设置回调函数
	Request->OnProcessRequestComplete().BindUObject(this, &UMyBlueprintFunctionLibrary::RequestComplete);
	// 发送请求
	Request->ProcessRequest();

}

void UMyBlueprintFunctionLibrary::RequestComplete(FHttpRequestPtr RequestPtr, FHttpResponsePtr ResponsePtr, bool bIsSuccess)
{
	for (FString AllHeader : ResponsePtr->GetAllHeaders())
		UE_LOG(LogTemp,Warning,TEXT("%s"),*AllHeader);
	UE_LOG(LogTemp,Warning,TEXT("%d"),bIsSuccess);
	if (!EHttpResponseCodes::IsOk(ResponsePtr->GetResponseCode())) return;
	UE_LOG(LogTemp,Warning,TEXT("%d"),bIsSuccess);
	// 获得返回的json数据
	TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(ResponsePtr->GetContentAsString());
	// 把FString转成TCHAR
	TCHAR* serializedChar = ResponsePtr->GetContentAsString().GetCharArray().GetData();
	// 解决中文乱码问题,服务端也是utf-8
	TCHAR_TO_UTF8(serializedChar);
	FString myData(serializedChar);
	// 打印信息
	//FWHelper::Debug(myData);
	// 创建Json对象
	TSharedPtr<FJsonObject> JsonObject;
	// 反序列化json
	bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
	// 判断是否反序列化成功
	if (bIsOk)
	{
		FString data = JsonObject->GetStringField("status");
		//FWHelper::Debug(data);
		UE_LOG(LogTemp,Warning,TEXT("%s"),*data);
		UE_LOG(LogTemp,Warning,TEXT("%s"),*myData);
		
		FString OutputString;
		TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> Writer = 	TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&OutputString);
		FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); //Serialize:把内存中的对象转为便于存储和传输的数据
		//打印
		UE_LOG(LogNet, Warning, TEXT("output 1:\n%s"), *OutputString);
		
		TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Object = JsonObject->GetObjectField(TEXT("result"));
		TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));
		FString StringField = ObjectField->GetStringField("text");
		CurrentTQ=StringField;
		FString StringField1 = ObjectField->GetStringField("wind_dir");
		CurrentF=StringField1;
		UE_LOG(LogNet, Warning, TEXT("output 1:\n%s"), *StringField);
		FOK.Broadcast();
	}
}

因为是在蓝图函数库,我们需要这样调用
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10 编译hadoop源码报错

报错信息&#xff1a; 信息: 用提供的模式无法找到文件。 "devenv command was not found. Verify your compiler installation level."解决方案 右键&#xff0c;以管理员身份打开 之后再次执行mvn 命令即可. 也可以再打开的时候先执行一下命令&#xff1a; dev…

数字化是信息化的升级吗?数字化信息化这两者有什么联系和区别?

也可以这样说吧&#xff0c;但总是太抽象&#xff0c;不准确的&#xff0c;两者还是有很大区别的。 首先来看信息化、数字化具体是什么意思 想要明白两者之间的差异&#xff0c;首先要搞清楚他们的出处—— 所谓信息化、数字化还有现在提很多的智能化&#xff0c;其实都是从…

如何免费将springboot+vue项目部署上线(云服务器+宝塔面板)

本文整个流程是在博主完成一次项目上线全过程后复盘的记录&#xff0c;有没有写到的细节不清楚的可以私聊提问&#xff0c;这里选用的是阿里云服务器&#xff0c;阿里云对学生用户可以免费使用一个月服务器&#xff0c;不定期也有活动&#xff0c;我白嫖了7个月服务器&#xff…

ZYNQ——脉宽调制之呼吸灯实现

文章目录 原理简介实验代码软件仿真板上验证 原理简介 呼吸灯的实现过程就是把不同占空比的脉冲输出后加在LED上&#xff0c;LED灯就会显示不同的亮度&#xff0c;通过不断地调节方波的占空比&#xff0c;LED灯的亮度也会跟着变化&#xff0c;看起来就像是“呼吸”一样。 要得…

陪诊小程序系统|陪诊软件开发|陪诊系统功能和特点

随着医疗服务的逐步改善和完善&#xff0c;越来越多的人群开始走向医院就诊&#xff0c;而其中不少人往往需要有人陪同前往&#xff0c;这就导致了许多矛盾与问题的发生&#xff0c;比如长时间等待、找不到合适的陪诊人员等。因此为人们提供一种方便快捷的陪诊服务成为了一种新…

如何挽救误剪切的TF卡数据 ?三招救援

在日常使用TF卡过程中&#xff0c;我们可能会遇到误操作导致数据被剪切并丢失的情况。这无疑给我们带来了困扰&#xff0c;因为我们可能丢失了重要的照片、视频、文档等文件。然而&#xff0c;不必过于担心&#xff0c;因为TF卡数据剪切后的恢复仍然有希望。本文将向您介绍几种…

基于DeepLabv3Plus开发构建人脸人像分割系统

在图像分割领域中有不少优秀出色的网络&#xff0c;DeepLab系列就是其中非常经典的分支之一&#xff0c;在之前的很多项目中陆续都已经有接触到了&#xff0c;在处理图像分割中表现出色。 DeepLabV3Plus是一种用于语义分割任务的深度学习模型&#xff0c;它是DeepLab系列模型的…

市场营销书籍推荐,这些书帮你学好营销

市场营销一直是商业运作中的重要环节&#xff0c;因此市场营销的知识一直备受关注。在这篇文章中&#xff0c;小编将向你推荐三本经典市场营销书籍&#xff0c;通过阅读这些书籍能让你更深入了解市场营销的基本概念和策略。 1、《经理人参阅&#xff1a;市场营销》 《经理人参…

高效游戏项目进度管理指南:打造顺畅开发之路!

完成一个游戏项目可能是一项具有挑战性的任务&#xff0c;特别是当你刚刚开始时。为了确保你的项目在预算内按时运行&#xff0c;制定计划并管理你的进度是很重要的。以下是一些帮助你管理游戏项目进度的技巧。 1、明确游戏目标: 在开始之前&#xff0c;你必须明确项目的范围以…

附件类文件存储在环信和不存储在环信时的两种实现方式

场景一: 附件类文件存储在环信服务器 使用环信EMChatManager#downloadAttachment下载附件方案 &#xff08;本篇文章以图片消息为例&#xff0c;其他附件类消息类似&#xff09;&#xff1a; 一、 通过EMFileMessageBody#getLocalUrl判断有没有本地文件&#xff1b; EMImageM…

ROS学习篇之硬件准备(零)-thinkbook16+锐龙版 安装ubuntu20.04遇到的各种坑

文章目录 一.计算机配置二.遇到的问题及解决办法1.键盘失灵2.无法联wifi3.蓝牙搜索不到设备4.无法开热点 三.最后的感想 一.计算机配置 CPU: AMD R7 6800H &#xff08;网卡&#xff0c;娱乐大师读出来的不对&#xff0c;在windos系统下&#xff0c;联想管家读出来网卡的型号是…

C++数据结构笔记(5)栈的顺序存储结构实现

1.对于栈和队列&#xff0c;相比于数组和线性表&#xff0c;使用规则受到了限制&#xff0c;因此也被称为“受限线性表”。 2.对于栈类型来说&#xff0c;元素符合先进后出的规律&#xff0c;且栈中的元素不能自由遍历。 3.栈的顺序存储结构简称为顺序栈&#xff0c;其思想是…

神经网络之VGG

目录 1.VGG的简单介绍 1.2结构图 3.参考代码 VGGNet-16 架构&#xff1a;完整指南 |卡格尔 (kaggle.com) 1.VGG的简单介绍 经典卷积神经网络的基本组成部分是下面的这个序列&#xff1a; 带填充以保持分辨率的卷积层&#xff1b; 非线性激活函数&#xff0c;如ReLU&a…

制作投票链接小程序教程,让你的活动更具吸引力与效果

相信投票链接是一种方便快捷的投票方式&#xff0c;不仅可以用于活动中的投票&#xff0c;还可以用于品牌营销和市场调研。投票链接是一种非常方便的方式来进行在线投票。这里就推荐一个免费制作投票活动的网站&#xff1a;乔拓云&#xff0c;创建简单、免费使用、操作灵活。支…

Linux环境搭建(三)— 搭建数据库服务器

linux &#xff08;ubuntu&#xff09;安装mysql 和环境配置 一、安装MySql二、配置环境三、外网访问四、重置密码五、卸载 写在前面&#xff1a; 本文默认你的Linux系统已经安装vim&#xff0c;yum等&#xff0c;如你使用的是一个全新的操作系统&#xff0c;移步上一篇开始配置…

回波数据adc_data.bin解析(附MATLAB程序)

毫米波雷达系统性能参数分析 1、xWR1642—DCA1000 TI目前有两款采集卡TSW1400和DCA1000&#xff0c;可以为xWR1243/1443和1642毫米波雷达进行回波数据采集。本文将主要介绍几款雷达分别用2款采集卡数据采集的回波数据格式以及MATLAB数据解析程序。 1、xWR1642—DCA1000 &…

【Servlet学习二】Servlet原理(Tomcat) ServletAPI

目录 &#x1f31f;一、Servlet运行原理 &#x1f308;1、Servlet的执行原理&#xff08;重点&#xff09; &#x1f308;2、Tomcat伪代码的简单理解 2.1 Tomcat初始化流程 2.2 Tomcat处理请求流程 2.3 Servlet 的 service 方法的实现 &#x1f31f;二、Servlet API 详…

SFP3012-ASEMI代理MHCHXM(海矽美)快恢复二极管SFP3012

编辑&#xff1a;ll SFP3012-ASEMI代理MHCHXM&#xff08;海矽美&#xff09;二极管SFP3012 型号&#xff1a;SFP3012 品牌&#xff1a;MHCHXM&#xff08;海矽美&#xff09; 封装&#xff1a;TO-247AB 恢复时间&#xff1a;≤65ns 正向电流&#xff1a;30A 反向耐压&a…

初学spring5(三)依赖注入(DI)

学习回顾&#xff1a;初学spring (五) 快速上手spring Dependency Injection 一、概念 依赖注入&#xff08;Dependency Injection,DI&#xff09;。依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 . 二、构造器…

SQL-每日一题【180.连续出现的数字】

题目 表&#xff1a;Logs 编写一个 SQL 查询&#xff0c;查找所有至少连续出现三次的数字。 返回的结果表中的数据可以按 任意顺序 排列。 查询结果格式如下面的例子所示&#xff1a; 示例 1: 解题思路 1.要查询至少连续出现三次的数字&#xff0c;则可以转化为&#xff08;…