将ClojureScript edn序列化为文本文件(类似于json)?

3

我正在使用ClojureScript,希望可以将一个巨大的EDN数据结构(特别是一个大的映射表)以文本文件的形式序列化(就像JS对象被存储为.json文件一样)。性能问题不是问题。

这是否可能?如果可能的话,是否有被认为是标准/最佳实践的方法来完成此操作?

2个回答

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一样容易。


2

这是非常可能的。

这种方法会给你一个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 字符串放在向量中传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接