我正在使用ClojureScript,希望可以将一个巨大的EDN数据结构(特别是一个大的映射表)以文本文件的形式序列化(就像JS对象被存储为.json
文件一样)。性能问题不是问题。
这是否可能?如果可能的话,是否有被认为是标准/最佳实践的方法来完成此操作?
我正在使用ClojureScript,希望可以将一个巨大的EDN数据结构(特别是一个大的映射表)以文本文件的形式序列化(就像JS对象被存储为.json
文件一样)。性能问题不是问题。
这是否可能?如果可能的话,是否有被认为是标准/最佳实践的方法来完成此操作?
可以使用pr-str
或clojure.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一样容易。
这是非常可能的。
这种方法会给你一个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))