gpt4 book ai didi

json - 解析和生成 JSON

转载 作者:行者123 更新时间:2023-12-04 01:38:59 27 4
gpt4 key购买 nike

Mathematica 的 list of built-in formats相当广泛;但是,JSON 不在该列表中。是否有用于在 Mathematica 中生成和解析 JSON 的现有解决方案,或者我们将不得不推出我们自己的解决方案?

最佳答案

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

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

首先,JSON 解析的一个非常快速和肮脏的部分解决方案是这样的:

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

即,只需用大括号替换方括号,用箭头替换冒号,然后对其进行评估。
剩下的就是不要在字符串内部进行这些替换。
(还需要对 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]]

( cateval 是方便的函数。简单的 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], "\""->"\\\""] <> "\""

关于json - 解析和生成 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com