解析并生成 JSON

2024-01-08

数学的内置格式列表 http://reference.wolfram.com/mathematica/guide/ImportingAndExporting.html相当广泛;然而,JSON 并不在该列表中。 Mathematica 中是否有用于生成和解析 JSON 的现有解决方案,或者我们是否必须推出自己的解决方案?


更新:正如 Pillsy 的回答所述,JSON 是 Mathematica 8 中导入和导出的内置格式:http://reference.wolfram.com/mathematica/ref/format/JSON.html http://reference.wolfram.com/mathematica/ref/format/JSON.html。但是,正如评论中所讨论的,从 Mathematica 10.4.1 开始,以下似乎是更强大的解决方案:

警告:这涉及执行 eval (ToExpression),因此不要使用它来解析来自不受信任来源的字符串。

首先,JSON 解析的一个真正快速但肮脏的部分解决方案是这样的:

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

即,只需将方括号替换为大括号,将冒号替换为箭头,然后对其进行评估。 剩下的就是not在字符串内部进行这些替换。 (还需要对 null、true、false 和科学记数法进行更多替换。)

对于不在字符串内的问题,可能有一个更优雅的解决方案,但首先想到的是进行替换,例如"{"->"(*MAGICSTRING*){"然后,在 eval 之后(当字符串之外的注释消失时),反转这些替换。 (PS:稍后再回到这一点,我实际上对它的巧妙之处感到非常满意,而且它似乎非常强大。魔法弦 FTW!)

说起来容易做起来难,但以下 JSON 解析器似乎可以工作:

cat = StringJoin@@(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^"}},
  eval@StringReplace[cat@FullForm@eval[StringReplace[json, tr]], Reverse/@tr]]

(cat and eval是便利功能。简单地cat = ToString在这种情况下会起作用,但我喜欢这个更通用的版本,它将所有参数连接成一个字符串。)。

最后,这是一个生成 JSON 的函数(它确实需要更通用的cat,以及另一个以 JSON 合适的方式显示数字的实用函数):

re = RegularExpression;
jnum[x_] := StringReplace[
  ToString@NumberForm[N@x, ExponentFunction->(Null&)], re@"\\.$"->""]

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], "\""->"\\\""] <> "\""
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析并生成 JSON 的相关文章

随机推荐