2010-04-13 81 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