Udon Graph 基础教程-VRCJson使用指南
本期是VRCJson在UdonGraph的使用方法,我们可以通过DownloadString来下载JSON文件,再通过下文的方法来转化成DataToken,并使用DataToken来输出参数,本文将会详细解读如何使用Graph来完成这个过程。
UdonGraph:VRC JSON
https://creators.vrchat.com/worlds/udon/data-containers/vrcjson/
如何序列化/反序列化一个JSON文件
首先我们需要明白,VRC的Json文件以及后续的DataToken,Datalist,Dictionaries都不可以预设,本篇我们只讨论从JSON导入到VRC中,不详细讨论Token,List,Dictionary方面的详细问题。
另外我强烈建议写Json时无论你的数据时什么格式,都一律以String格式来储存,等到获取到参数之后再转换至对应格式——VRCJson写的十分构式,这样可以降低这部分出现bug的概率。
反序列化:
如果我们已经拥有了一个JSON,我们可以使用VRCJson.TryDeserializeFromJson来反序列化出Data containers文件
VRCJson.TryDeserializeFromJson |
string输入 | bool,DataToken | 从 JSON 字符串输入创建 DataList 或 DataDictionary。如果成功,则返回 true,结果令牌将为 DataDictionary 或 DataList。如果不成功,这将返回 false 并放置一个错误,解释结果令牌中的问题是什么。 |
生成的DataToken并不可以直接用于获取参数,我们需要先将其转化为字典或者列表才可以进行下一步操作,你可以不必在此提前做好转化,只需要在您准备接入方法是调用Get XX即可,示例如下:
VRCJson会根据输入的Json来生成字典和列表中的一个。
序列化:
如果我们拥有一个Data containers,我们需要将其以JSON的方式输出出去,我们可以使用VRCJson.TrySerializeToJson来序列化JSON
VRCJson.TrySerializeToJson |
DataToken 输入,JsonExportType | bool,DataToken 结果 | 尝试将 DataDictionary 或 DataList 转换为 JSON 字符串输出。如果成功,则返回 true,结果令牌将是包含最终 Json 的字符串。如果不成功,这将返回 false 并放置一个错误,解释结果令牌中的问题是什么。 |
序列化为 Json 时,您可以选择所需的 JsonExportType。如果您想要人类可读的内容,Beautify 会更好。如果您想要通过网络发送的紧凑内容,Minify 会更好。
- 美化:将每个元素展开为新行,并为每个深度添加一个选项卡。
- 缩小:将所有内容保持在一行中,并最大限度地减少空格。
如何获取DataToken中的数据
在从 DataToken 中获取值之前,你需要确定它包含什么类型,因为如果你尝试拉取一个不兼容的类型,它会让UdonBehaviour崩溃。有几种方法可以确保包含的类型与要提取的类型兼容。
- 您可以检查属性以获取确切的类型
DataToken.TokenType
- 从 Data List 或 Data Dictionary 中检索值时,您可以使用并指定 TokenType。如果 TokenType 不正确,则该函数将返回 false。
TryGetValue
- 您可以检查属性以获取它是否为数字。如果是这样,那么你可以安全地拉取 property ,这将为你提供一个 double upcasted 无论它实际上是哪种类型。如果类型为 或 ,则可能会丢失精度。
DataToken.IsNumber
Number
long
ulong
- 无论令牌的类型如何,它始终是一个有效的选项,并且永远不会引发错误。
ToString
你可以直接使用Get来获取数据
当Json嵌套时该如何解嵌套
我们这里拿台球俱乐部的玩家分数当作示例Json,他的结构如下:
{
"scores": {
"A1": "1882.1652568364993",
"A2": "1863.5989323493907",
"A3": "1686.7993635948164",
"A4": "1392.851076060002",
"A5": "1378.2606184626945",
"A6": "1368.4536773345992"
}
}
我们可以看出来,这个是一个二层嵌套结构的字典类型的JSON,其中第一层为KEY为:scores,第二层为数据
我们将字符串装入参数:A中,先进行反序列化:
反序列化的结果会通过DataToken Result输出,如果您不确定输出的类型是什么,请使用GetType来确定它究竟被转换成了什么类型。
第二部我们用Get DataDictionary将数据类型从DataToken转化为DataDictionary,然后接入到TryGetValue,将我们的Key:scores输入进去。然后就完成了解开第一层嵌套的过程,现在输出的datatoken就是第二层的数据层。
我强烈建议您为每一个TryGetValue的输出的布尔接口都接上Debug.Log,根据奇怪的实践经验,不接的话有可能会产生不明Bug
然后我们在建立一个一模一样的结构,并且在Key处输入我们需要提取的数据的KEY,就可以从Json中拿取数据了
如何从Datalist中获取到参数
直接从按照索引获取对应层级再读取数据
反序列化
读取指定层级
读取字典参数
参数读取完毕
感谢您的阅读。
No Comments