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

Schreibe einen Kommentar