Part1前言
UE5在蓝图中处理json字符串,目前主流的方案有两种,一种是官方提供的插件Json Blueprint Utilities另外一种是使用VaRest插件
但是这两种插件在处理json的时候,都考虑的是适配所有情况的sjon解析,所以导致解析json的代码非常长。
本文主要介绍一种思路,将json字符串与蓝图结构体进行映射,从而只需要一个函数即可完成json数据的处理。
Part2实现思路
虚幻官方提供了C++版本的json与结构体映射库,在JsonUtilities模块中。
json转结构体
FJsonObjectConverter::JsonObjectToUStruct
结构体转json字符串
FJsonObjectConverter::UStructToJsonObjectString
但是在蓝图中,该方法不可用,我们只需要将蓝图适配即可。
1蓝图CustomThunk
蓝图CustomThunk可以实现泛型蓝图节点。通过CustomThunk我们可以将任意蓝图结构体对象传递到C++函数,之后就可以使用官方提供的JsonUtilities模块了。
蓝图定义如下
UFUNCTION(BlueprintCallable, Category = "InJson", CustomThunk, meta = (CustomStructureParam = "Struct", DisplayName = "StructToJsonString"))
static bool StructToJsonString(FString& OutJsonString, const UStruct* Struct);
函数实现如下
DECLARE_FUNCTION(execStructToJsonString)
{
P_GET_PROPERTY_REF(FStrProperty, OutJsonString);
Stack.StepCompiledIn<FStructProperty>(nullptr);
void* InStruct = Stack.MostRecentPropertyAddress;
P_FINISH;
bool bSuccess = false;
FStructProperty* StructProp = CastField<FStructProperty>(Stack.MostRecentProperty);
if (StructProp && InStruct)
{
UScriptStruct* StructType = StructProp->Struct;
P_NATIVE_BEGIN;
bSuccess = Inner_StructToJsonString(OutJsonString, StructType, InStruct);
P_NATIVE_END;
}
*static_cast<bool*>(RESULT_PARAM) = bSuccess;
}
上述的写法都是规定格式
P_GET_PROPERTY_REF
P_FINISH
P_NATIVE_BEGIN
P_NATIVE_END
RESULT_PARAM
P_FINISH之前获取函数参数代码块
P_NATIVE_BEGIN和P_NATIVE_END 宏包裹着真正执行该函数功能的被调用函数
RESULT_PARAM返回函数返回值
Part3InJson插件
我们封装了InJson插件,可以轻松实现json字符串与蓝图结构体的互相转换。所有过程都只需要一个函数即可搞定。
2json字符串转struct
3struct转json字符串
4开源地址
项目地址:https://github.com/inveta/InJson 在releases中,可以下载编译好的插件,开箱即用。
Part4总结
本文给大家分享了我们开源的ue5蓝图json库,实现json字符串与蓝图结构体的互相转换,以及介绍了这个库的实现思路和做这个库的目的。
Part5关于IN VETA
IN VETA是一支由建模、美术、UE5组成的年轻团队。
我们的开源项目:
https://github.com/inveta
我们致力于三维数字孪生技术分享与研发。
欢迎与各界朋友一起探讨技术与商务合作,一起推动数字孪生的发展。