From 2f29cecfcd190641f44090ed8e4b4b379722ec68 Mon Sep 17 00:00:00 2001 From: Bobby Calderwood Date: Fri, 16 Dec 2011 16:46:19 -0500 Subject: [PATCH] Added clojure.data.json. --- src/cljs/clojure/data/json.cljs | 76 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 76 insertions(+), 0 deletions(-) create mode 100644 src/cljs/clojure/data/json.cljs diff --git a/src/cljs/clojure/data/json.cljs b/src/cljs/clojure/data/json.cljs new file mode 100644 index 0000000..4c8eca9 --- /dev/null +++ b/src/cljs/clojure/data/json.cljs @@ -0,0 +1,76 @@ +(ns clojure.data.json + (:require [clojure.string :as string] + [goog.json :as gjson])) + +(defprotocol JsonStringable + (json-str [obj] "Returns the object as a JSON string.")) + +(extend-protocol JsonStringable + boolean + (json-str [obj] (gjson/serialize obj)) + + number + (json-str [obj] (gjson/serialize obj)) + + array + (json-str [obj] (gjson/serialize obj)) + + object + (json-str [obj] (gjson/serialize obj)) + + string + (json-str [obj] + (if (or (keyword? obj) + (symbol? obj)) + (gjson/serialize (name obj)) + (gjson/serialize obj))) + + LazySeq + (json-str [obj] (gjson/serialize (vec obj))) + + IndexedSeq + (json-str [obj] (gjson/serialize (vec obj))) + + List + (json-str [obj] (gjson/serialize (vec obj))) + + Cons + (json-str [obj] (gjson/serialize (vec obj))) + + EmptyList + (json-str [obj] "[]") + + Vector + (json-str [obj] (str \[ + (string/join \, (map json-str obj)) + \])) + + ObjMap + (json-str [obj] (str \{ + (string/join \, (map (fn [[k v]] + (str (json-str k) ":" + (json-str v))) + obj)) + \})) + + HashMap + (json-str [obj] (str \{ + (string/join \, (map (fn [[k v]] + (str (json-str k) ":" + (json-str v))) + obj)) + \})) + + Set + (json-str [obj] (json-str (vec obj)))) + +(defn read-json + ([input] + (js->clj (gjson/parse input))) + ([input keywordize?] + (let [obj (read-json input)] + (if (and keywordize? + (map? obj)) + (into {} (map (fn [[k v]] [(keyword k) v]) + obj)) + obj)))) -- 1.7.7.3