UE4 Json解析方法与原理

JsonObjectStringToUStruct 函数原理分析

作用是将Json字符串解析到UStruct中保存起来

  1. 初始化FJsonObject,初始化TJsonReader

  2. 将TJsonReader(Json字符串) 反序列化/解析 为FJsonObject

    逐块数据解析,每遇到一个'{'或'['就压栈并保存对应的Key,对每一个字符串/数字/布尔/Null类型的值就直接保存,每遇到一个'}'或']'就出栈,最终形成一个以StackState为结点的多叉树。最后根据是否有最外层的大括号,将返回FJsonValueObject或FJsonValueArray。

  3. 将FJsonObject解析到UStruct中保存

    递归遍历UStruct的每一个可反射参数,查找FJsonObject中是否存在对应的Key,若存在,直接根据类型赋值,不存在则跳过

UStructToJsonObjectString原理

将UStruct序列化为Json格式字符串。原理是上一个函数的逆过程,不再展开。

可被Json解析到UStruct的类型,结构体成员需要为UE4可反射的类型

FEnumProperty:枚举类型,需要值为枚举参数对应的字符串名称

FNumericProperty:double/int64类型,当值为数值参数时使用double解析,当值为字符串时使用int64解析,最后将解析完成的参数保存到传入的类型(长整数是使用double解析,可能出现精度问题,此时需要传入字符串)

FBoolProperty:bool类型,值为true/True/flase/Flase

FStrProperty:FString类型,值为字符串类型(注意转义字符)

FArrayProperty:TArray类型,值为数组

FMapProperty:TMap类型,值为一个Object,但是对象内部每个成员的类型都需要与TMap相同,键为字符串,值为对应的数据结构

FSetProperty:TSet类型,值为数组,要求数值内部的每个成员是同一种类型

FTextProperty:FText类型,值为字符串或Object,若为Object则该Object需要是特殊的专门为FText设置的对象

FStructProperty:FStruct类型,值为Object或字符串,当值为Object时按照正常的流程递归解析,当值为字符串时进入UE4特殊的解析途径。若解析后的参数类型是FDataTime/FColor/FLinearColor类型时,可以由特定格式的字符串解析后得到

FObjectProperty:UObject类型,还没看懂!!

Json解析过程中使用到的结构体/枚举类型解释

EJson:支持的Json语法类型(全支持),StackState当前对应的Json结构

TJsonReader:用来保存并读取Json字符串

FJsonObject:用于保存大括号内部的每一个键值对,为树状结构

EJsonNotation:标记当前字符串解析的状态

StackState:积累Json的每一个键值对,值为任何允许的类型

总结与注意

  1. 使用Json解析方法需要在.cs文件中添加“JSONUTILITIES”与“JSON”模块。

  1. 解析所有Json数值类型数据都是使用的double解析,需要注意浮点精度问题

  2. 解析后的参数类型不一定与Json数据类型对应,参考我的第三段内容

  3. 只有可以被反射的UStruct成员才能参与Json解析,否则忽略

  4. Json中存在而UStruct不存在的参数或UStruct中存在而Json不存在的参数均被忽略

  5. Json解析可能非常损耗性能(文本可能巨大),尽量少调用且最好放在异步线程,不需要的Json参数不要写在UStruct中参与解析

  6. 在需要多次解析一个Json的地方,请不要直接将Json转换成UStruct,而因该转换成FJsonObject作为缓存,然后从FJsonObject转换成需要的UStruct

作者:张行,邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/m0_59723700/article/details/128696960
今日推荐