在 ClojureScript 中序列化 JavaScript 个对象

Serialize JavaScript objects in ClojureScript

如何编写 JS 错误对象的编写器以通过网络发送?当我做 (pr-str (js/Error. "OOPS")) 它给了我 "#object[Error Error: OOPS]"(js->clj (js/Error. "Oops!")) 给出类似 #object[Error Error: Oops!] 的内容。 我想为 JS 错误创建一个编写器,这样我就可以通过网络(也许是 EDN)发送它们并在另一端反序列化。

ClojureScript 不会尝试使用构造函数序列化 JS 对象,除了一些例外情况,例如 js/Date。 在 js/Error 的情况下,首先要问:这在 JS 世界中将如何解决? 此处提供一个答案:

(.stringify js/JSON (.getOwnPropertyNames js/Object err))

如果您需要将错误序列化为 EDN 而不是 JSON,您只需自己迭代错误自己的 属性 名称并填写数据结构。像

(defn err->edn [e]
  (into {}
        (map (fn [k]
               [(keyword k) (js->clj (gobject/get e k))]))
        (.getOwnPropertyNames js/Object e)))

其中 gobject 是必需的,因为 [goog.object :as gobject]