将ClojureScript序列化为文本文件(如json)?

时间:2016-04-09 00:29:05

标签: clojurescript

我正在使用ClojureScript,并希望以文本文件的形式序列化大量EDN数据结构(特别是:大型地图)(与JS对象存储为.json文件的方式相同)。性能问题不是问题。

这是否可行,如果可行,是否考虑采用标准/最佳实践方法?

2 个答案:

答案 0 :(得分:4)

是。 使用pr-strclojure.pprint/pprint编写EDN并使用clojure.edn/read-string来摄取EDN。

在ClojureScript中,您可能会面临与从浏览器访问文件系统时Javascript相同的挑战。例如,要从浏览器保存文件,事情可能有点棘手:

(defn save-file [filename t s]
  (if js/Blob
    (let [b (js/Blob. #js [s] #js {:type t})]
      (if js/window.navigator.msSaveBlob
        (js/window.navigator.msSaveBlob b filename)
        (let [link (js/document.createElement  "a")]
          (aset link "download" filename)
          (if js/window.webkitURL
            (aset link "href" (js/window.webkitURL.createObjectURL b))
            (do
              (aset link "href" (js/window.URL.createObjectURL b))
              (aset link "onclick" (fn destroy-clicked [e]
                                     (.removeChild (.-body js/document) (.-target e))))
              (aset link "style" "display" "none")
              (.appendChild (.-body js/document) link)))
          (.click link))))
    (log/error "Browser does not support Blob")))

所以它取决于你如何访问文件的上下文,但只要你能得到/放入字符串,它就像pr-str和edn / read-string一样简单。

答案 1 :(得分:1)

这很有可能。

这种方法为您提供了一个URL字符串,例如"blob:http://localhost:3000/4a6407c6-414e-4262-a194-28bd2b72be00",您可以在其中将数据下载到浏览器上。

(defn download-as-edn [coll]
  (-> coll
      str
      vector
      clj->js
      (js/Blob. #js {:type "text/edn"}))
      js/URL.createObjectURL)) 

请注意,Blob采用了一个序列,因此我们将其传递给向量内的edn字符串。