JsonObjectStringToUStruct 函数原理分析
作用是将Json字符串解析到UStruct中保存起来
-
初始化FJsonObject,初始化TJsonReader
-
将TJsonReader(Json字符串) 反序列化/解析 为FJsonObject
逐块数据解析,每遇到一个'{'或'['就压栈并保存对应的Key,对每一个字符串/数字/布尔/Null类型的值就直接保存,每遇到一个'}'或']'就出栈,最终形成一个以StackState为结点的多叉树。最后根据是否有最外层的大括号,将返回FJsonValueObject或FJsonValueArray。
-
将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的每一个键值对,值为任何允许的类型
总结与注意
-
使用Json解析方法需要在.cs文件中添加“JSONUTILITIES”与“JSON”模块。
-
解析所有Json数值类型数据都是使用的double解析,需要注意浮点精度问题
-
解析后的参数类型不一定与Json数据类型对应,参考我的第三段内容
-
只有可以被反射的UStruct成员才能参与Json解析,否则忽略
-
Json中存在而UStruct不存在的参数或UStruct中存在而Json不存在的参数均被忽略
-
Json解析可能非常损耗性能(文本可能巨大),尽量少调用且最好放在异步线程,不需要的Json参数不要写在UStruct中参与解析
-
在需要多次解析一个Json的地方,请不要直接将Json转换成UStruct,而因该转换成FJsonObject作为缓存,然后从FJsonObject转换成需要的UStruct文章来源:https://www.toymoban.com/news/detail-490352.html
作者:张行,邮箱:2252313806@qq.com文章来源地址https://www.toymoban.com/news/detail-490352.html
到了这里,关于UE4 Json解析方法与原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!