Xan 發帖很酷代碼將 JSON 數據讀入 JMP。Xan 指出 JSL 加載大型 JSON 文件的速度很慢;下面是一些替代 JSL 以使其更快。(JSON 更適合小對象,但如果您必須加載 100K 或更多,這將有所幫助。)
Xan 的原始代碼有一個解析例程,可以一次讀取一個字符的 JSON 字符串:

變量位置遍歷字符串的長度,到結尾,一次一個字符。Xan 代碼中真正的魔力在於對 [, ], {, } 字符的處理。我只是將神奇的部分複製到替換代碼中。上面可以看到對引號、冒號、t、f的處理。這些字符指導解析器處理後續字符。
JMP 的模式匹配器是這項工作的更好選擇。下面的 JSL 是一個從頭到尾處理整個字符串的單一模式匹配。當每個塊匹配時,匹配中嵌入的一些 JSL 會處理該塊。
替換代碼的片段(不要復制這個!附件中有更好的代碼):

替換 parse 函數現在只有 5 行,但來自原始 parse 函數的代碼現在在模式解析,乍一看似乎相當複雜。但實際上它與原版中的邏輯幾乎相同(魔法被複製幾乎確切地!)模式解析開始於PatPos (0) 並以PatRPos (0) 強制模式匹配所有內容。原始代碼有一個while循環。模式解析有PatRepeat反而。PatRepeat正在重複三個操作的串聯 (+):(1) PatPos (無參數)將當前字符位置記錄到失敗位置因此,如果 JSON 數據難以理解,Parse 可以說一些有用的東西。(2)圍網通過告訴匹配器到柵欄的所有內容都是正確的並且不應該重新訪問來加快匹配速度。(3) 括號中的備選方案 (|) 是有趣的地方;跳過空格、匹配名稱、匹配冒號等。圖案名稱和圖案編號(未顯示)在附件中,並按照您的猜測進行操作。
最後一塊拼圖是PatTest .PatTest將其參數評估為 0 或 1;如果為 1,則測試成功,不匹配任何字符,匹配繼續。(如果它以 0 失敗,那麼匹配器會備份並嘗試替代方案,但這在這里永遠不會發生:注意每一個PatTest以 ;1 結尾作為返回值。)在這個程序中, PatTest用於在比賽中間注入一些 JSL,而不是實際測試任何東西。
通過這些更改和 Xan 建議的更改要將列表末尾的慢速插入替換為列表開頭的快速插入,JMP 在 90 秒內加載了 180MB 的 JSON 數據(而 5 分鐘內加載了 0.25MB),提高了 1000 倍。也許更好,因為它現在可能與文件大小成線性關係。

附上的代碼沒有經過很好的測試,如果對你有用,請留言,謝謝!
如果您發現自己在這裡:這是在 JMP 具有良好的內置 JSON(和 XML)解析之前。 這個例子仍然是一個很好的例子,說明瞭如何有效地使用 JMP 的模式匹配。
JSON 和 XML 導入的內置嚮導可能會勝過此代碼,並幫助您使用所需數據製作數據表。