Разбор и генерация JSON - PullRequest
       25

Разбор и генерация JSON

11 голосов
/ 14 апреля 2010

Mathematica список встроенных форматов довольно обширный; однако JSON нет в этом списке. Существует ли существующее решение для генерации и анализа JSON в Mathematica, или нам придется развернуть наше собственное решение?

Ответы [ 3 ]

18 голосов
/ 14 апреля 2010

ОБНОВЛЕНИЕ: Как отмечено в ответе Пиллси, JSON - это встроенный формат для импорта и экспорта по состоянию на Mathematica 8: http://reference.wolfram.com/mathematica/ref/format/JSON.html. Но, как обсуждалось в комментариях, следующее, кажется, более надежное решение по состоянию на Mathematica 10.4.1:

ПРЕДУПРЕЖДЕНИЕ. Это включает выполнение eval (ToExpression), поэтому не используйте его для разбора строк из ненадежных источников.

Во-первых, действительно быстрое и грязное частичное решение синтаксического анализа JSON будет таким:

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

Т.е. просто замените квадратные скобки фигурными скобками, а двоеточия - стрелками, а затем оцените их. Все, что остается, это , а не делать эти замены внутри строк. (Также необходимо добавить еще несколько замен для нулевых, истинных, ложных и научных обозначений.)

Вероятно, есть более элегантное решение проблемы, не связанной со строками, но первое, что приходит на ум, - это выполнить подстановки, такие как "{"->"(*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 и 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], "\""->"\\\""] <> "\""
3 голосов
/ 25 февраля 2011

Начиная с Mathematica 8, JSON - это встроенный формат , поддерживающий как импорт, так и экспорт.

2 голосов
/ 14 апреля 2010

У этого парня есть умный пример анализа кода JSON в Mathmatica

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...