任何人都有任何用于访问javascript对象的idiomatic clojurescript文档(以json形式返回,本质上是哈希)?
我有一个通过AJAX请求返回的JSON对象:
{
list: [1,2,3,4,5],
blah: "vtha",
o: { answer: 42 }
}
如何使用clojurescript访问这些字段?
我能做到:
(.-list data)
但是当我有嵌套的值和对象时,它是如何工作的?
(.-answer (.-o data))
上面的内容似乎非常笨拙,特别是考虑到js语法很好:data.o.answer。
使用clojurescript访问json对象的惯用方法是什么?
注意:
我意识到我实际上可以使用JS语法来引用元素,这实际上非常方便。所以以下内容将正常工作:
(str data.o.answer)
答案 0 :(得分:16)
你可能想要年龄:
(aget foo "list")
aget还没有变量,但希望很快就会
现在它是可变的。 (aget data "o" "answer")
可以运作
答案 1 :(得分:10)
首先,您提出的嵌套访问语法确实有效:
ClojureScript:cljs.user> (def data
(JSON/parse "{\"list\": \"[1,2,3,4,5]\", \"blah\": \"vtha\", \"o\": {\"answer\": \"42\"}}"))
#<[object Object]>
ClojureScript:cljs.user> (.-answer (.-o data))
"42"
您可以使用线程宏...
ClojureScript:cljs.user> (-> data (.-o) (.-answer))
"42"
或..
符号
ClojureScript:cljs.user> (.. data -o -answer)
"42"
答案 2 :(得分:5)
如果你正在处理任何数量的数据,我会将JSON转换为clojure数据结构,然后使用通常的习语:
(let [my-json (js* "{
list: [1,2,3,4,5],
blah: \"vtha\",
o: { answer: 42 }
}")
converted (js->clj my-json)]
(get-in converted ["list" 3]) ;; => 4
(-> converted "o" "answer") ;;=> 42
)
(注意:如果你能提供帮助,请不要使用js*
;它不是惯用的,可能会在未来的ClojureScript版本中消失。)
答案 3 :(得分:1)
Clojurescript有一个..运算符,对链接的javascript调用很有用:
(.. data -o -answer) => data.o.answer => 42
(aget (.. data -list) 1) => data.list[1] => 2
您也可以在数组上使用大多数列表运算符,例如
(into [] (.. data -list)) ; vector [1 2 3 4]
答案 4 :(得分:1)
忘了aget,它主要是为数组(数组get)而设计的。使用
查看更多