UE4 解析json

来源:互联网 发布:农村淘宝加盟申请 编辑:程序博客网 时间:2024/05/21 06:45

目录(?)[+]

声明:所有权利保留。

转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43794409


Json的Writer博客地址:

http://blog.csdn.net/cartzhang/article/details/41009343  UE4的Json读写方式<一>

UE4 的json读写方式

一、UE4的Json解析代码

有网友说UE4的解析有问题,解析出错。个人觉得应该是Json格式有问题。或解析的对象不正确,对象或数组用来对应的解析方式来解析的。


解析方式有两种:类名为:FJsonSerializer,头文件名称为JsonSerializer.h



[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. template <class CharType>  
  2.     static bool Deserialize( const TSharedRef< TJsonReader<CharType> >& Reader, TArray< TSharedPtr<FJsonValue> >& OutArray )  
  3.     {  
  4.         StackState State;  
  5.         if ( !Deserialize( Reader, /*OUT*/State ) )  
  6.         {  
  7.             return false;  
  8.         }  
  9.   
  10.         if ( State.Object.IsValid() )  
  11.         {  
  12.             return false;  
  13.         }  
  14.   
  15.         OutArray = State.Array;  
  16.         return true;  
  17.     }  
  18.   
  19.     template <class CharType>  
  20.     static bool Deserialize( const TSharedRef< TJsonReader<CharType> >& Reader, TSharedPtr<FJsonObject>& OutObject )  
  21.     {  
  22.         StackState State;  
  23.         if ( !Deserialize( Reader, /*OUT*/State ) )  
  24.         {  
  25.             return false;  
  26.         }  
  27.   
  28.         if ( !State.Object.IsValid() )  
  29.         {  
  30.             return false;  
  31.         }  
  32.   
  33.         OutObject = State.Object;  
  34.         return true;  
  35.     }  

可以看出,第一个是针对数组的,第二个是针对Json对象的。请注意分别。


二、样例代码

CPP中包含头文件#include "Json.h"。

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. void ATestPhysics1Character::JsonDeserialize()  
  2. {  
  3.     FString JsonValue = "[{\"author\":\"4446545646544\"},{\"name\":\"jack\"}]";  
  4.       
  5.     FString JsonStr;  
  6.     TArray<TSharedPtr<FJsonValue>> JsonParsed;  
  7.     TSharedRef< TJsonReader<TCHAR> > JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonValue);     
  8.           
  9.     bool BFlag = FJsonSerializer::Deserialize(JsonReader, JsonParsed);  
  10.     if (BFlag)  
  11.     {  
  12.         int ArrayNumber = JsonParsed.Num();  
  13.         if (ArrayNumber == 2)  
  14.         {  
  15.             FString FStringAuthor = JsonParsed[0]->AsObject()->GetStringField("author");  
  16.             if (GEngine)  
  17.             {  
  18.                 FString TmpString = "author :" + FStringAuthor;  
  19.                 GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TmpString);  
  20.             }  
  21.             FString FStringName = JsonParsed[1]->AsObject()->GetStringField("name");  
  22.             if (GEngine)  
  23.             {  
  24.                 FString TmpString = "name :" + FStringName;  
  25.                 GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TmpString);  
  26.             }  
  27.         }  
  28.     }  
  29. }  

代码不严谨,但是是个样子。

三、结果截图




概述

制作游戏在很多情况下需要和WEB服务器进行交互,最常见的是在做Demo时需要通过游戏向WEB服务器传递数据(登录/注册验请求),WEB服务器处理(操作数据库)之后返回结果并调用指定的方法。 该教程简单介绍了如何通过UE4向WEB服务器(PHP)发送json数据包及回调方法。


添加模块和头文件引用

在代码编辑器中打开项目解决方案,在<Solution Name>/Source/<ProjectName>路径下,找到并打开<ProjectName>.Build.cs文件,添加HTTP模块:

 PrivateDependencyModuleNames.AddRange(new string[] {"HTTP"}); PrivateIncludePathModuleNames.AddRange(new string[] {"HTTP"});

然后在需要实现该功能的类文件中添加如下的头文件引用:

 #include "Http.h"#include "Json.h"


创建json数据包

数据内容为:

{ "user" : "StormUnited"}

创建:

 // Create a writer and hold it in this FStringFString JsonStr;TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR> > > JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR> >::Create(&JsonStr);JsonWriter->WriteObjectStart();JsonWriter->WriteValue(TEXT("user"), TEXT("StormUnited"));JsonWriter->WriteObjectEnd(); // Close the writer and finalize the output such that JsonStr has what we wantJsonWriter->Close();

至此,json数据包准备完成。


准备接收json数据包的PHP网页

本示例中使用了PHP,你可以选择使用搭建动态网站或者服务器的开源软件,比如说wamp/lamp等在本机上建立一个WEB服务器来解析PHP页面。 创建mywebpage.php文件,并添加如下代码:

<?php     // 首先接收上传的数据     $post_data = file_get_contents('php://input');     // 解析json字符串     $obj = json_decode($post_data);     // 获取包含在Json字符串中的数据     echo $obj->{'user'};?>


POST数据

将通过如下的代码将上面准备好的json数据包提交给 http://localhost/mywebpage.php

  • SetHeader:可以设置POST数据的格式
  • SetURL:可以指定用于处理上传数据的链接
  • SetVerb:可以设置POST/PUT/GET
  • SetContentAsString:用于填充上传的数据内容
  • OnProcessRequestComplete().BindUObject 用于指定在发送请求之后的回调方法。
TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json; charset=utf-8"));HttpRequest->SetURL(TEXT("http://localhost/mywebpage.php"));HttpRequest->SetVerb(TEXT("POST"));HttpRequest->SetContentAsString(JsonStr);HttpRequest->OnProcessRequestComplete().BindUObject(this, &ASUMiniGameMode::HttpCompleteCallback);HttpRequest->ProcessRequest();


关于回调函数的结构:void HttpCompleteCallback(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful); 示例:

void ASUMiniGameMode::HttpCompleteCallback(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful){     FString MessageBody = "";      // If HTTP fails client-side, this will still be called but with a NULL shared pointer!     if (!Response.IsValid())     {          MessageBody = "{\"success\":\"Error: Unable to process HTTP Request!\"}";     }     else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))     {          MessageBody = Response->GetContentAsString();     }     else     {          MessageBody = FString::Printf(TEXT("{\"success\":\"HTTP Error: %d\"}"), Response->GetResponseCode());     }}

一旦发送出请求后肯定会调用HttpCompleteCallback方法,WEB服务器处理的数据结果包含在Response参数中,可以通过Response->GetContentAsString()来获取返回的字符串,比如在本例中是StormUnited。

  1. 获取游戏路径 
    FString gameDir = FPaths::GameDir();
  2. 写入文件 
    FString path; 
    FString string; 
    FFileHelper::SaveStringToFile(string, *path);
  3. 读取文件 
    FString path; 
    FString string; 
    FFileHelper::LoadFileToString(string, *path);

0 0
原创粉丝点击