JSON / JSON
在 VL 里,默认不是直接对 JSON 对象做操作,而是把 JSON 转换成 XElement —— 后者很容易查看和修改。反过来,XElement 也随时可以转换成 JSON。
加载一个 JSON 文件
加载文件可能相当耗时,因而会打断你本来流畅的帧率。为此 VL 提供了两种文件读取方案:
- 简单好用、但会阻塞的方案
- 不阻塞、但要多点几下才能配好的方案
阻塞
用 JSONReader [System.XML] 节点读一个 .json 文件,结果以 XElement 的形式给你:
JSONReader 加载一个 .json 文件并立刻以 XElement 返回,这可能会阻塞程序其余部分的执行
不阻塞(响应式)
异步加载 .json 文件最简单的办法,是把 JSONReader (Reactive) [System.XML] 和 HoldLatest [Reactive] 连起来用。文件加载完成后,HoldLatest 会在它的 On Data 输出上打出一个脉冲,并把文件内容以 XElement 返回:
JSONReader (Reactive) 加载一个 .json 文件,在之后的某一帧以 XElement 返回,因而程序其余部分不会被打断
而既然已经进了响应式/异步的世界,你还可以对这个文件做进一步的解析,比如用 ForEach [Reactive]:
这个例子里,除了异步加载文件之外,还顺手取出了根元素的名字作为一个简单示范。不过显然,你在这里可以做更昂贵的运算,而它们照样不会打断你的帧率
这样一来,加载和解析都是异步完成的,只有两者都完成之后,你才拿到结果去做后续处理。
解析一个 JSON 字符串
如果你手上有一个 JSON 格式的字符串,直接用 ParseJSON [System.XML] 节点把它转成 XElement 以便后续处理:

保存一个 JSON 文件
保存文件可能相当耗时,因而会打断你本来流畅的帧率。为此 VL 提供了两种文件写入方案:
- 简单好用、但会阻塞的方案
- 不阻塞、但要多点几下才能配好的方案
阻塞
用 JSONWriter [System.XML] 节点把给定的 XElement 写进一个 .json 文件:

不阻塞(响应式)
异步保存 .json 文件最简单的办法,是把 JSONWriter (Reactive) [System.XML] 和 ToObservable [Reactive] 连起来用。把 XElement 接到 ToObservable 节点的 Message 输入上,再给它的 Send 输入打一个脉冲,操作就开始了。保存完成后,JSONWriter 的 On Completed 输出会打出一个脉冲:

不过连搭建 XElement 结构本身都可能很耗时,所以你也可以把草图的这一部分甩进响应式的世界,只在写文件之前才做,比如用 ForEach [Reactive]:

这样一来,创建 XElement 和保存文件都是异步完成的,不会打断你的帧率。
把 XElement 转换成 JSON 格式的字符串
如果你有一个 XElement,只是想把它转成 JSON 格式的字符串,用 ToJSON [System.XML] 节点:
