clojurescript - 使用 js->clj 转换为 json 时如何保留数组中的关键字?

标签 clojurescript clojurescript-javascript-interop

我的实际行为是

(js->clj (clj->js [:a :b :c]) :keywordize-keys true)
=> ["a" "b" "c"]

期望的行为

[:a :b :c]

最佳答案

我不使用 ClojureScript,但应该注意 :keywordize-keys 没有执行任何操作,因为向量是按索引键控的。向量的元素是值,而不是索引。

你可以做类似的事情

(->> [:a :b :c]
     (clj->js)
     (js->clj)
     (mapv keyword))

; Should print [:a :b :c]

当然,如果结构是嵌套的,这会变得有点复杂,但总体思路是一样的。


由于 JSON 无法识别“关键字”的概念,因此没有简单的方法可以在两种格式之间进行转换并维护什么是字符串和什么是关键字。如果确实需要区分,可以使用 Clojure 的 EDN 格式而不是 JSON。不过,只有当您不进行过多的 JavaScript 互操作时,这才有效。与普通 JS 库交换的任何数据都将涉及关键字和字符串的合并,除非该库理解 EDN 格式,或者您做了一些不幸的事情,例如将某种元数据附加到对象来指示什么是关键字,什么不是关键字。 p>

您也可以完全放弃关键字的想法,并在内部使用字符串来处理所有内容。这会很糟糕,但至少会让互操作变得更容易。

关于clojurescript - 使用 js->clj 转换为 json 时如何保留数组中的关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53531174/

相关文章:

clojure - 如何在 ClojureScript 中获取由 fetch API 返回的 Response 对象的正文文本?

clojurescript - 如何在 ClojureScript 中编写不可知的 JavaScript 库?

ClojureScript 为多页面 Web 应用程序单独构建

clojure - Clojure 中的 :foo、::foo、::bar/foo 和 :bar/foo 之间有什么区别?

javascript - 从 Javascript 调用 ClojureScript

momentjs - 使用 cljsjs/moment 让 Moment 在 Clojurescript 中工作

Clojure Lein Figwheel 错误 - 重新框架的 Luminus 项目

clojurescript - d3 JavaScript 到 ClojureScript 的翻译

clojurescript - 在 re-frame 应用程序中使用 rc-animate 对 antizer 表进行动画处理