用一个函数撬动整个Json

Part1前言

UE5在蓝图中处理json字符串,目前主流的方案有两种,一种是官方提供的插件Json Blueprint Utilitiescc48c762369d73119d3964bd135d402c.png另外一种是使用VaRest插件

a901f998d04f327d0812c0d0d1ddd028.png

但是这两种插件在处理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

e87deb06624c4f3198efe3a64b95ad90.png

3struct转json字符串

00bf469f4b972b2e016f05caeae7fd25.png

4开源地址

项目地址:https://github.com/inveta/InJson 在releases中,可以下载编译好的插件,开箱即用。d37bcd82d4ebffdadff214933b590133.png

Part4总结

本文给大家分享了我们开源的ue5蓝图json库,实现json字符串与蓝图结构体的互相转换,以及介绍了这个库的实现思路和做这个库的目的。

Part5关于IN VETA

IN VETA是一支由建模、美术、UE5组成的年轻团队。

6a0569f59207b66793aac066fb64e1fc.jpeg

我们的开源项目:
https://github.com/inveta

我们致力于三维数字孪生技术分享与研发。
欢迎与各界朋友一起探讨技术与商务合作,一起推动数字孪生的发展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值