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

时间:2018-11-29 02:55:42

标签: clojurescript clojurescript-javascript-interop

我的实际行为是

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

期望的行为

[:a :b :c]

1 个答案:

答案 0 :(得分:2)

我不使用ClojureScript,但应注意,:keywordize-keys并没有做任何可能的事情,因为向量是由索引键控的。向量的元素是值,而不是索引。

您可以做类似的事情

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

; Should print [:a :b :c]

当然,如果结构是嵌套的,这会变得有些复杂,但这是相同的基本思想。


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

您也可以完全放弃关键字的想法,并在内部将Strings用于所有内容。那会很烂,但至少会使互操作更容易。