Skip to main content

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文件

364ad0d3ac9ec562c5bbae23f651cd9d.png

VRCJson.TryDeserializeFromJson

string输入 bool,DataToken 从 JSON 字符串输入创建 DataList 或 DataDictionary。如果成功,则返回 true,结果令牌将为 DataDictionary 或 DataList。如果不成功,这将返回 false 并放置一个错误,解释结果令牌中的问题是什么。

生成的DataToken并不可以直接用于获取参数,我们需要先将其转化为字典或者列表才可以进行下一步操作,你可以不必在此提前做好转化,只需要在您准备接入方法是调用Get XX即可,示例如下:

VRCJson会根据输入的Json来生成字典和列表中的一个。

0cb33795e2927bb61bfc7702a9c06360.png

序列化:

如果我们拥有一个Data containers,我们需要将其以JSON的方式输出出去,我们可以使用VRCJson.TrySerializeToJson来序列化JSON

5797524ed71b6feb06125cdfd7689adb.png

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.IsNumberNumberlongulong
  • 无论令牌的类型如何,它始终是一个有效的选项,并且永远不会引发错误。ToString

2f0f08ad069091eb2730fcef1453600b.png

你可以直接使用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,第二层为数据

27e1b9645dc0a9b594fa262c4f32a1df.png

我们将字符串装入参数:A中,先进行反序列化:

反序列化的结果会通过DataToken Result输出,如果您不确定输出的类型是什么,请使用GetType来确定它究竟被转换成了什么类型。

9d59ed3bec3019961d54d6dda650a612.png

第二部我们用Get DataDictionary将数据类型从DataToken转化为DataDictionary,然后接入到TryGetValue,将我们的Key:scores输入进去。然后就完成了解开第一层嵌套的过程,现在输出的datatoken就是第二层的数据层。

我强烈建议您为每一个TryGetValue的输出的布尔接口都接上Debug.Log,根据奇怪的实践经验,不接的话有可能会产生不明Bug

fc407208c83da30b3867f31d7b398127.png

然后我们在建立一个一模一样的结构,并且在Key处输入我们需要提取的数据的KEY,就可以从Json中拿取数据了

7365d23ad34ad04a96804a4e3166272c.png


如何从Datalist中获取到参数

直接从按照索引获取对应层级再读取数据

反序列化

4d0d99690b3168d80e7567b5dd45499d.png

读取指定层级

546525324e1c7f1c0ab3b16051e462e9.png

读取字典参数

f0eedea87f4f16c754c17049e16e25fa.png

参数读取完毕

 

感谢您的阅读。