2010-04-13 78 views

回答

18

UPDATE解析JSON代碼的一個聰明的例子:如Pillsy的回答指出,JSON是一個內置的導入和導出格式的Mathematica 8:http://reference.wolfram.com/mathematica/ref/format/JSON.html。但是,正如在評論中所討論的那樣,以下似乎是Mathematica 10.4.1中更強大的解決方案:

警告:這涉及到做一個eval(ToExpression),所以不要用它來解析來自不受信任的字符串源。

首先,一個真正的快速和骯髒的部分解決JSON解析會是這樣:

ToExpression[StringReplace[json, {"["->"{", "]"->"}", ":"->"->"}]] 

也就是說,只需更換方括號花括號和冒號的箭頭,然後EVAL它。 剩下的就是而不是在字符串內部進行這些替換。 (對於空,真,假和科學記數法還需要更多的替換。)

對於非內部字符串問題,可能有更優雅的解決方案,但首先想到的是做替換如"{"->"(*MAGICSTRING*){",然後在eval(當字符串外部的註釋將消失時)之後,將這些替換反轉。 (PS:稍後回顧一下,實際上我對它的聰明感到非常滿意,而且它看起來非常健壯。魔術字符串FTW!)

說起來容易做起來難,但下面的JSON解析器似乎工作:

cat = [email protected]@(ToString/@{##})&;   (* Like sprintf/strout in C/C++. *) 
eval = ToExpression;   (* Mathematica function names are too verbose! *) 

parseJSON[json_String] := With[{tr = {"["  -> "(*_MAGIC__[__*){", 
             "]"  -> "(*_MAGIC__]__*)}", 
             ":"  -> "(*_MAGIC__:__*)->", 
             "true" -> "(*_MAGIC__t__*)True", 
             "false" -> "(*_MAGIC__f__*)False", 
             "null" -> "(*_MAGIC__n__*)Null", 
             "e"  -> "(*_MAGIC__e__*)*10^", 
             "E"  -> "(*_MAGIC__E__*)*10^"}}, 
    [email protected][[email protected]@eval[StringReplace[json, tr]], Reverse/@tr]] 

cateval是方便的功能簡單cat = ToString會在這種情況下工作,但我喜歡這一點,會將其所有參數轉換成字符串更一般的版本)。

最後,這裏有一個函數生成JSON(這的確需要更普遍cat,還有另一個效用函數中的JSON適當的方式顯示數字):

re = RegularExpression; 
jnum[x_] := StringReplace[ 
    [email protected][[email protected], ExponentFunction->(Null&)], [email protected]"\\.$"->""] 

genJSON[a_ -> b_] := genJSON[a] <> ":" <> genJSON[b] 
genJSON[{x__Rule}] := "{" <> cat @@ Riffle[genJSON /@ {x}, ", "] <> "}" 
genJSON[{x___}] := "[" <> cat @@ Riffle[genJSON /@ {x}, ", "] <> "]" 
genJSON[Null]  := "null" 
genJSON[True]  := "true" 
genJSON[False]  := "false" 
genJSON[x_]  := jnum[x] /; NumberQ[x] 
genJSON[x_]  := "\"" <> StringReplace[cat[x], "\""->"\\\""] <> "\"" 
+0

@Pillsy,讓我們知道這是否適用於您,或者如果您發現任何錯誤或進行改進。你的回答對我來說是非常有幫助的,所以我很想報答你的恩惠! – dreeves 2010-04-15 21:22:16

+0

我現在正在使用這個版本,所以在這一點上它的測試合理。請注意剛剛修復的錯誤! – dreeves 2011-02-24 21:49:14

+3

Mathematica 8原則上可以爲JSON提供導入功能,但是它拒絕加載一個簡單的小型18 MB .json文件(它永遠在運行)。你的功能就像一個魅力。謝謝。 – phantomas1234 2011-10-28 23:12:01

2

This guy在Mathmatica

+0

我認爲這只是將數字從JSON表達式中拉出來,對吧? – dreeves 2010-04-14 05:34:14

+0

是的。這對於JSON來說很棒,所以很容易解析。 – 2010-04-14 11:48:22

+0

是的,我喜歡JSON。通過「只是將數字從JSON表達式中提取出來」,我的意思是將其完全解析爲一個同構嵌套的Mathematica表達式。我的答案試圖做到這一點。 – dreeves 2010-04-15 21:18:49