UE4C++Json与Struct转换
UE4中Json可以通过序列化和反序列函数实现Json结构和字符串之间的转换。可以将Json中的浮点,整型变量通过JsonReader获取,如果想要将自定义的结构体转换为JSON,复杂一点,可以通过将结构体内的参数通过序列化操作一点点加入JSON结构,也可以通过UE4 jsonobjectconvert中的原生函数实现。
定义结构体
在UE4C++中自定义结构体,主要通过在你需要加入结构体中的.h文件添加代码实现。主要结构如下:
USTRUCT(BlueprintType)
struct FMyStruct
{
GENERATED_BODY()
//~ 蓝图图表可以访问以下成员变量:
// 这是我们测试变量的提示文本。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Test Variables")
int32 MyIntegerMemberVariable;
//~ 蓝图图表无法访问以下成员变量:
int32 NativeOnlyMemberVariable;
/**~
* 蓝图图表无法访问此UObject指针,但是
* 指针对UE4的反射、智能指针和垃圾回收系统
* 可见。
*/
UPROPERTY()
UObject* SafeObjectPointer;
};
具体可以参考官方文档:
UE4C++添加结构体
准备操作
在执行准换前,需要给项目的build.cs文件添加"Json", "JsonUtilities"模块,同时在需要转换的文件中添加头文件:
#include “Runtime/JsonUtilities/Public/JsonObjectConverter.h”
转换将结构体转换为Json
例如我们自定义一个结构体
USTRUCT(BlueprintType)
struct FPlayer
{
GENERATED_BODY()
UPROPERTY()
FString Name;
UPROPERTY()
int32 Level;
UPROPERTY()
TArray<FString> Friends;
UPROPERTY(Transient)
FString PropertyToIgnore;
};
测试代码:
FPlayer Player;
Player.Name = "Frank";
Player.Level = 3;
Player.Friends.Add("Jeff");
Player.PropertyToIgnore = "Gotta Go Fast";
FString JSONPayload;
FJsonObjectConverter::UStructToJsonObjectString(Player, JSONPayload, 0, 0);
UStructToJsonObjectString第一个参数是自定义的结构体变量,第二个参数是一个字符串,该函数可以实现将结构体转换成JSON字符串。后面的两个参数可以不填,有默认参数重载。
最后的结果为:
{
"name": "Frank",
"level": 3,
"friends": ["Jeff"]
}
Json转结构体
Json转结构体主要也是将JSON字符串转换成结构体:
FString JSONPayload = "...";
FPlayer Player;
FJsonObjectConverter::JsonObjectStringToUStruct(JSONPayload, &Player, 0, 0);
JsonObjectStringToUStruct第一个参数是JSON字符串,第二个参数为接收数据的结构体变量引用。后面两个参数也可以去掉,有默认参数重载。
同时,如果是在网络通信中想要传输结构体,经过测试,只需要结构体内部的变量类型,名字一致,结构体名字不一定相同,都能实现结构体的数据传输。