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();
	}
}

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

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐