Mathematica's list of built-in formats jest dość rozbudowana; jednak JSON nie znajduje się na tej liście. Czy istnieje istniejące rozwiązanie do generowania i analizowania JSON w Mathematica, czy też będziemy musieli wdrożyć własne rozwiązanie?Parsowanie i generowanie JSON
Odpowiedz
UPDATE: Jak wspomniano w odpowiedzi Pillsy, w JSON jest wbudowany w formacie Importerów i Eksporterów jak z Mathematica 8: http://reference.wolfram.com/mathematica/ref/format/JSON.html. Ale, jak zostało to omówione w komentarzach, wydaje się, że poniższe rozwiązanie jest bardziej niezawodne niż w Mathematica 10.4.1:
OSTRZEŻENIE: To wymaga wykonania eval (ToExpression), więc nie używaj tego do analizowania ciągów od niezaufanych źródła.
pierwsze, bardzo szybkiego i brzydka częściowe rozwiązanie JSON parsowania byłoby to:
ToExpression[StringReplace[json, {"["->"{", "]"->"}", ":"->"->"}]]
Czyli po prostu zastąpić nawiasy kwadratowe z klamrami i dwukropkami ze strzałkami, a następnie eval go. Pozostaje tylko , a nie dokonanie tych zmian w łańcuchach. (Potrzebne są jeszcze kilka zastępstw dla zapisu zerowego, prawdziwego, fałszywego i naukowego).
Prawdopodobnie istnieje bardziej eleganckie rozwiązanie problemu niewiążącego się z łańcuchami, ale pierwszą rzeczą, o której należy pamiętać, jest zrobienie podstawienia takie jak "{"->"(*MAGICSTRING*){"
, a następnie po eval (gdy znikną komentarze poza ciągami), odwróć te podstawienia. (PS: Wracając do tego później, jestem całkiem zadowolony z tego sprytu i wygląda na to, że jest całkowicie niezawodny Magiczne łańcuchy FTW!)
To trochę łatwiej powiedzieć niż zrobić, ale następujący parser JSON wydaje się działać:
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
i eval
są funkcjami wygoda Wystarczy cat = ToString
będzie działać w tym przypadku, ale mi się podoba bardziej ogólną wersję, która skleja wszystkie swoje argumenty do łańcucha.).
Wreszcie tutaj funkcją wygenerować JSON (który ma potrzeby bardziej ogólne cat
, jak również inną funkcję użytkową do wyświetlania liczb w taki sposób, JSON odpowiednio)
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], "\""->"\\\""] <> "\""
This guy ma sprytnego przykład parsowania kodu JSON w Mathematica
Myślę, że to tylko wyciągnięcie liczb z wyrażenia JSON, prawda? – dreeves
tak. To wspaniała rzecz w JSON, tak łatwa do przeanalizowania. –
Tak, kocham JSON. Przez "wyciągnięcie liczb z wyrażeń JSON" miałem na myśli, w przeciwieństwie do pełnego analizowania, do izomorficznego zagnieżdżonego wyrazu Mathematica. Moja odpowiedź próbuje to zrobić. – dreeves
Na Mathematicą 8 JSON is a built-in format obsługuje zarówno import, jak i eksport.
- 1. Parsowanie Json Windows8
- 2. Parsowanie dużego pliku JSON
- 3. Parsowanie obiektów json
- 4. parsowanie json python
- 5. AS3 JSON parsowanie
- 6. Parsowanie JSON z GSON
- 7. Parsowanie JSON z Dart
- 8. Parsowanie JSON w J2ME
- 9. Parsowanie JSON z XmlHttpRequest.responseJSON
- 10. Parsowanie tablicy JSON w obiekty?
- 11. Parsowanie pliku json z gsonem
- 12. Parsowanie JSON (data) do Swift
- 13. Generowanie niestandardowego JSON tablicę
- 14. Jak testować jednostkę JSON parsowanie
- 15. Parsowanie JSON z żądania webhook
- 16. Parsowanie JSON bez cytowanych kluczy
- 17. Haskell, Aeson i JSON parsowanie w niestandardowym typie
- 18. Parsowanie JSON przy użyciu nowych Swift 3 i Alamofire
- 19. Parsowanie JSON i zapisywanie ich w bazie SQLite
- 20. Parsowanie JSON z drzewem właściwości doładowania
- 21. MongoDB + Java - parsowanie JSON przez com.mongodb.util.JSON.parse
- 22. JSON vs XML parsowanie prędkości w Delphi
- 23. parsowanie zagnieżdżonych zbiorów json do kolekcji szkieletowych
- 24. Parsowanie tablicy JSON przy użyciu Json.Net
- 25. Parsowanie json w C# bez znajomości indeksów
- 26. Parsowanie obiektu json na ciąg znaków
- 27. Eliksir - Zagnieżdżone parsowanie JSON do struktur
- 28. Parsowanie JSON do tablicy w skrypcie powłoki
- 29. Parsowanie tablicy zakodowanej w JSON przez perl
- 30. Parsowanie JSON podając błąd "nieoczekiwanego tokenu o"
@Pillsy, daj nam znać, jeśli to działa dla Ciebie lub jeśli znajdziesz jakieś błędy lub ulepszenia. Twoje odpowiedzi były dla mnie niesamowicie pomocne, więc chciałem odpłacić za przysługę! – dreeves
Używam tego teraz na prawdę, więc jest to właściwie dobrze przetestowane w tym momencie. Zwróć uwagę na poprawki błędów właśnie teraz! – dreeves
Mathematica 8 może w zasadzie mieć możliwości importowania JSON-a, ale odmawia załadowania prostego pliku o wielkości 18 mb .json (działa na zawsze). Twoja funkcja działa jak urok. Dziękuję Ci. – phantomas1234