Xan 贴的很爽代码将 JSON 数据读入 JMP。Xan 注意到 JSL 加载大型 JSON 文件的速度很慢;下面是一些替代 JSL 以使其更快。(JSON 更适合小对象,但如果您必须加载 100K 或更多,这会有所帮助。)
Xan 的原始代码有一个解析例程,一次读取一个字符的 JSON 字符串:

变量位置遍历字符串的长度,到结尾, 一次一个字符。Xan 代码的真正魔力在于对 [, ], {, } 字符的处理。我只是将神奇的部分复制到替换代码中。在上面,您可以看到对引号、冒号、t、f 的处理。这些字符指导解析器对后续字符的处理。
JMP 的模式匹配器是这项工作的更好选择。下面的 JSL 是一个单一的模式匹配,它从头到尾处理整个字符串。当匹配每个块时,匹配中嵌入的一些 JSL 会处理该块。
替换代码的片段(不要复制这个!附件中更好的代码):

替换解析函数现在只有 5 行,但是原始解析函数的代码现在在模式解析,乍一看似乎很复杂。但实际上它与原始逻辑几乎相同(魔术是复制的几乎确切地!)模式解析开始于PatPos (0) 并以PatRPos (0) 强制模式匹配所有内容。原始代码有一个 while 循环。模式解析有拍重复反而。拍重复正在重复三个操作的串联 ( + ):(1) PatPos (无参数)将当前字符位置记录到故障定位所以如果 JSON 数据难以理解,Parse 可以说一些有用的东西。(2) PatFence通过告诉匹配器所有直到栅栏的东西都是正确的并且不应该被重新访问来加速匹配。(3) 带括号的备选方案列表 ( | ) 是有趣的地方;跳过空格、匹配名称、匹配冒号等。模式名称和花样编号(未显示)在附件中,按照您的猜测进行操作。
最后一块拼图是测试.测试将其参数评估为 0 或 1;如果为 1,则测试成功,不匹配任何字符,然后继续匹配。(如果它以 0 失败,那么匹配器会备份并尝试替代方案,但这里从未发生过:注意每一个测试返回值以 ;1 结尾。)在这个程序中,测试用于将一些 JSL 注入匹配的中间,而不是实际测试任何东西。
通过这些更改和 Xan 建议的更改为了用列表开头的快速插入替换列表末尾的缓慢插入,JMP 在 90 秒内加载了 180MB 的 JSON 数据(5 分钟内加载了 .25MB),提高了 1000 倍。也许更好,因为它现在可能与文件大小成线性关系。

所附代码未经过充分测试,如果对您有用,请回帖,谢谢!
如果您发现自己在这里:这是在 JMP 具有良好的内置 JSON(和 XML)解析之前。 这个例子仍然是一个很好的例子,说明了如何有效地使用 JMP 的模式匹配。
用于 JSON 和 XML 导入的内置向导可能会胜过此代码,并帮助您使用所需数据制作数据表。