Tob*_*ede 15 javascript json clojure clojurescript
任何人都有任何用于访问javascript对象的idiomatic clojurescript的文档(作为json返回,本质上是哈希)?
我有一个通过AJAX请求返回的JSON对象:
{
list: [1,2,3,4,5],
blah: "vtha",
o: { answer: 42 }
}
Run Code Online (Sandbox Code Playgroud)
如何使用clojurescript访问这些字段?
我可以:
(.-list data)
Run Code Online (Sandbox Code Playgroud)
但是当我有嵌套值和对象时,它是如何工作的?
(.-answer (.-o data))
Run Code Online (Sandbox Code Playgroud)
以上似乎非常笨拙,特别是考虑到良好的js语法:data.o.answer.
用clojurescript访问json对象的惯用方法是什么?
注意:
我意识到我实际上可以使用JS语法来引用元素,这实际上非常方便.所以以下内容将正常工作:
(str data.o.answer)
Run Code Online (Sandbox Code Playgroud)
dno*_*len 16
你可能想要年龄:
(aget foo "list")
Run Code Online (Sandbox Code Playgroud)
aget还没有变量,但希望很快就会
变成variadic.(aget data "o" "answer")会工作
sw1*_*1nn 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"
Run Code Online (Sandbox Code Playgroud)
您可以使用线程宏...
ClojureScript:cljs.user> (-> data (.-o) (.-answer))
"42"
Run Code Online (Sandbox Code Playgroud)
或者..表示法
ClojureScript:cljs.user> (.. data -o -answer)
"42"
Run Code Online (Sandbox Code Playgroud)
如果你正在处理任何数量的数据,我会将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
)
Run Code Online (Sandbox Code Playgroud)
(注意:js*如果你可以提供帮助,请不要使用;它不是惯用的,可能会在未来版本的ClojureScript中消失.)
| 归档时间: |
|
| 查看次数: |
8131 次 |
| 最近记录: |