tl;dr
如何从ClojureScript:中的数字派生关键字
(keyword 22)
;;=> :22 but in fact returns nil.
背景
在我的ClojureScript/Hoplon应用程序中,我通过cljs-HTTP发出HTTP请求。我收到的部分回复如下:
{:companies
{:22 {:description ... } ; A company.
:64 {:description ... }
... }
{:offers
[{:description ... } ; An offer.
{:description ... }
... ]
:offers
后面的向量内的每个要约都有一个:companyId
,它表示:companies
中的一个密钥。一旦我收到响应,我就reset!
一个细胞(类似于原子(query
。
现在,我想对每个offer进行迭代,并调用一个创建相应HTML的函数offer-tpl
。为了做到这一点,offer-tpl
需要报价本身以及相关公司:
(for [offer (:offers @query)]
(offer-tpl offer (get-in @query [:companies (keyword (:companyId offer))]))))))
尽管这肯定可以做得更优雅(建议非常感谢(,但get-in
不起作用。(:companyId offer)
返回一个数字(例如22
(,但(keyword (:companyId offer))
返回nil
。调用(keyword (str (:companyId offer)))
可以做到这一点,但没有其他方法吗?
(keyword "22")
或(keyword (str 22))
返回:22
获得:22
的原因可能是JSON翻译的keywordize-keys
选项。例如:
cljs-http默认为jsonp的keywordize密钥:https://github.com/r0man/cljs-http/blob/1fb899d3f9c5728521786432b5f6c36d1d7a1452/src/cljs_http/core.cljs#L115但在这种情况下,您可以(也应该(传入一个禁用关键字化的标志。
并非JSON中的所有键都适用于Clojure关键字化。例如,JSON键中的空格是有效的,但在Clojure中无效。
请注意,数字关键字可能不正确。https://clojuredocs.org/clojure.core/keyword#example-542692cec026201cdc326d70这个警告似乎已经从当前的Clojure网站上删除了,所以也许这意味着什么,但我不确定是什么。
http://clojure.org/reference/reader目前,
关键字-关键字类似于符号,除了:它们可以而且必须以开头带有冒号,例如:fred。它们不能包含"."或名称类。像符号一样,它们可以包含一个名称空间,:person/name关键字在当前命名空间中解析以两个冒号开头的:in用户名称空间::rect读作:user/rrect
以及
符号以非数字字符开头,可以包含字母数字。
此关键字定义不包括:22
和:with spaces
关键字函数返回无效输入的结果,但这不是认可,这只是因为在Clojure的核心部分中,检查不正确的输入会带来性能开销。
简言之,并不是所有的JSON键都能转换为关键字,所以您应该避免keywordize-keys
,除非您知道密钥空间和/或这样做提供了一些便利。