Парсинг и генерация JSON

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

11
задан Pillsy 13 April 2010 в 20:34
поделиться

2 ответа

ОБНОВЛЕНИЕ: как указано в ответе Пилси, JSON - это встроенный формат для импорта и экспорта в системе Mathematica 8: http: // ссылка .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 = T oString будет работать в этом случае, но мне нравится эта более общая версия, которая объединяет все свои аргументы в строку.).

Наконец, вот функция для генерации 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], "\""->"\\\""] <> "\""
18
ответ дан 3 December 2019 в 04:52
поделиться

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

2
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: