18

javascriptオブジェクトにアクセスするための慣用的なclojurescriptのドキュメントを持っている人はいますか(jsonとして返され、本質的にハッシュ)?

AJAX リクエストを介して返された JSON オブジェクトがあります。

{
  list: [1,2,3,4,5],
  blah: "vtha",
  o: { answer: 42 }
}

clojurescript を使用してこれらのフィールドにアクセスするにはどうすればよいですか?

できます:

(.-list data)

しかし、ネストされた値とオブジェクトがある場合、これはどのように機能するのでしょうか?

(.-answer (.-o data))

上記は、data.o.answer.

clojurescriptでjsonオブジェクトにアクセスする慣用的な方法は何ですか?

ノート:

JS 構文を使用して実際に要素を参照できることに気付きました。これは実際には非常に便利です。したがって、以下は正しく機能します。

(str data.o.answer)
4

5 に答える 5

17

おそらく取得したい:

(aget foo "list")

aget はまだ可変長ではありませんが、すぐ に可変長になることを願っています。(aget data "o" "answer")うまくいくだろう

于 2012-03-22T16:26:29.357 に答える
11

まず、ネストされたアクセスに対して提案された構文は機能します。

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"
于 2012-03-22T11:07:35.530 に答える
6

扱うデータ量に関係なく、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 の将来のバージョンでなくなる可能性があります。)

于 2012-03-22T14:39:53.683 に答える