Wie man Clojure-Code zu und von JSON abbildet?
Ich habe eine verrückte Idee, die mit putting einige clojure-code in CouchDB und schreiben von sichten, Abfragen. Ich will nicht zum speichern der clojure-code als plain text, weil dann müsste ich befürchten, analysieren es in den Ansichten. Formatierung und Kommentare, die nicht erhalten werden müssen, aber der code sollte in der Lage sein zu gehen in die und aus der Datenbank ohne änderung in der Struktur. Schlüsselwörter, Symbole und Zeichenketten sollten alle bleiben in Ihrer Muttersprache geben. Zudem habe ich den code zu schauen elegant und effizient sein.
Ich denke der Darstellung der Dinge wie folgt:
- Symbole als strings beginnen mit '
- Keywords wie Saiten, die dann beginnen mit :
- Strings unverändert, außer, wenn Sie beginnen, mit ', oder :,, in dem Fall sind Sie mit Backslashes.
- (parens) als ein array
- [Klammern] ein array mit "_[]" als das erste element
- Karten ({}) als Objekt
- sets (#{}) als ein Objekt mit den Werten auf 1 gesetzt und die "_#{}" eingeschlossen.
Kritiken, Erfahrungen, und Ideen sind willkommen.
Bearbeiten: Hier ist, was passiert, wenn ich versuche, das Lesen und schreiben von JSON-code in der json-Funktionen von clojure.contrib:
user> code
((ns bz.json.app (:use (ring.middleware file))) (defn hello [req] {:status 200, :headers {"Content-Type" "text/plain"}, :body "Hello World!"}) (def app (wrap-file hello "public")))
user> (read-json (json-str code))
[["ns" "bz.json.app" ["use" ["ring.middleware" "file"]]] ["defn" "hello" ["req"] {"body" "Hello World!", "headers" {"Content-Type" "text/plain"}, "status" 200}] ["def" "app" ["wrap-file" "hello" "public"]]]
Es ist eine faire bisschen, dass getan werden muss, um für Zeile 4 von oben zu sein, genau wie die Linie 2. Es scheint, dass es ein Bibliothek-Projekt, es sei denn, es gibt eine Funktion irgendwo das das geht, weiß ich nicht.
Mit solch einer Bibliothek, hier ist, was nannte es Aussehen könnte:
user> (= (json-to-code (read-json (json-str (code-to-json code)))) code)
true
InformationsquelleAutor der Frage Ben Atkin | 2010-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke deine Idee ist gut, aber ich würde vereinfachen die Handhabung von Sammlungen durch die Verwendung von tagged arrays (
["list", …]
["vector", …]
) statt. Abgesehen davon, würde ich nicht ändern Sie die Implementierung der Strategie.Ich mag deine Idee und den code in Clojure, also nahm ich einen Stich an der Umsetzung Ihrer
code-to-json
(mit den oben genannten Vorschlag incorporated) bei https://gist.github.com/3219854.Dies ist die Ausgabe, die es erzeugt:
json-to-code
ist Links als übung für den Leser. 😉InformationsquelleAutor der Antwort qerub
Als mikera vorgeschlagen, clojure.contrib.json/schreiben-json konvertiert nicht nur primitive Typen, aber Clojure ist
ISeq
s und Java ' sMap
sCollection
s undArray
s auch. Dabei sollten Sie die meisten der code (als Daten), aber in der Veranstaltung, die Sie möchten, schreiben Sie etwas schicker mag, es ist einfach zu erweitern, die JSON-Schriftsteller, durch Nachahmung aus Stuart Sierra source-code (siehe hier):Dies wird vorausgesetzt, Sie brauchen nicht zu speichern, berechnet bytecode, oder gefangen Verschlüsse. Dies wäre ein ganz anderes Spiel deutlich härter. Aber da die meisten Clojure-code (wie die meisten Lisp) kann gesehen werden als ein Baum/Wald S-Ausdrückesollten Sie OK sein.
Analyse aus JSON zurück an den Daten getan werden kann, mit
clojure.contrib.json/read-json
(dauert eine kurze Zeit, um die Optionen betrachten, die auf der definition, die Sie verwenden möchten, können Sie). Danacheval
kann Ihr bester Freund sein.InformationsquelleAutor der Antwort Edgar
Wenn Sie möchten, um die Verwendung von JSON als eine Darstellung, würde ich dringend empfehlen die Verwendung clojure.contrib.jsondie bereits nicht den job der Umwandlung von Clojure-Datenstrukturen JSON ziemlich nahtlos.
Keinen Sinn, das Rad neu erfinden 🙂
Ich habe es ziemlich erfolgreich in meinem aktuellen Clojure-Projekt. Wenn es nicht alles tun, was Sie wollen, dann können Sie immer tragen einen patch, um es zu verbessern!
InformationsquelleAutor der Antwort mikera
clojure.contrib.json
wurde abgelöst durchclojure.Daten.json
:Vielleicht möchten Sie auch zu verwenden
cheshire
die hat eine nette API und Unterstützung für verschiedene Erweiterungen, wie eigene Codierung und LÄCHELN (binary JSON):InformationsquelleAutor der Antwort Drew Noakes
Vollständigkeit halber gibt es auch clj-jsondie verwendet Jackson unter zum Parsen der JSON.
InformationsquelleAutor der Antwort kotarak
Version 0.1.2 von clojure.Daten.json das ganze könnte dann so Aussehen denke ich:
InformationsquelleAutor der Antwort Benjamin Peter