使用clojurescript以惯用方式访问json对象

时间:2012-03-22 10:55:00

标签: javascript json clojure clojurescript

任何人都有任何用于访问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)

5 个答案:

答案 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)而设计的。使用

  • goog.object / GET
  • goog.object /组

查看更多