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

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")会工作

  • 为了记录,它现在是可变的.(aget数据"o""回答")会起作用. (3认同)

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)


Kev*_* L. 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
)
Run Code Online (Sandbox Code Playgroud)

(注意:js*如果你可以提供帮助,请不要使用;它不是惯用的,可能会在未来版本的ClojureScript中消失.)