Mathematica的list of built-in formats相当广泛;但是,JSON不在该列表中。是否有在Mathematica中生成和解析JSON的现有解决方案,还是我们将不得不推出我们自己的解决方案?解析并生成JSON
11
A
回答
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]]
(cat
和eval
是方便的功能简单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], "\""->"\\\""] <> "\""
2
3
由于数学8,支持导入和导出的JSON is a built-in format。
相关问题
- 1. 解析生成的JSON的问题
- 2. 如何解析JSON模式并创建默认json对象或生成java类?
- 3. 解析JSON成HTML模板
- 4. ajax post成功解析json
- 5. 解析成JSON在node.js中
- 6. JSON解析,并在PhoneGap的
- 7. 解析JSON并不首次
- 8. 试图JSON解析成swift3并显示成的UILabel
- 9. symfony1.4解析/生成plist
- 10. 从Firebase解析JSON对象并使用键值对生成内容
- 11. ANTLR生成的解析器产生MissingTokenException
- 12. C#JSON解析。解析转义JSON
- 13. 生成特定JSON格式的Python解析器
- 14. 从JavaScript生成的Cookie解析JSON字符串
- 15. 的Javascript无法解析JSON由ObjectMapper对象生成
- 16. JSON解析生成url编码的字符串
- 17. 解析动态生成的url和更多的json文件
- 18. 使用GSON解析JSON(通过分形生成)
- 19. 在json解析中发生异常
- 20. iOS JSON解析成NSDictionary,然后用SBJson解析NSArray
- 21. JSON解析不解
- 22. 春RestTemplate,拦截响应解析成JSON
- 23. 如何解析它们变成JSON
- 24. 解析json使用ajax成功函数
- 25. 无法解析JSON成一个ListView
- 26. 从JQuery.ajax成功数据解析JSON
- 27. 如何解析JSON阵列成POJO
- 28. 在C#子成员中解析JSON
- 29. 解析JSON成大熊猫数据帧
- 30. Python:如何解析JSON成员名
@Pillsy,让我们知道这是否适用于您,或者如果您发现任何错误或进行改进。你的回答对我来说是非常有帮助的,所以我很想报答你的恩惠! – dreeves 2010-04-15 21:22:16
我现在正在使用这个版本,所以在这一点上它的测试合理。请注意刚刚修复的错误! – dreeves 2011-02-24 21:49:14
Mathematica 8原则上可以为JSON提供导入功能,但是它拒绝加载一个简单的小型18 MB .json文件(它永远在运行)。你的功能就像一个魅力。谢谢。 – phantomas1234 2011-10-28 23:12:01