2017-04-10 78 views
0

我是一個新的Clojurescript,並且想要使用clojurescript和電子基於一個小json文件破解arround。使用Clojurescript訪問Json數據中的數組我使用Clojurescript訪問數組中的數據

我做這樣的事情(過境/ cljs)

(def jsondata (t/read (t/reader :json) (.readFileSync fs path_to_file "utf8"))))) 

首先我檢查,如果狀態正常,工作正常...

(let [json_status (get jsondata "status")] 
     (.log js/console "JSON Glossar Status:" json_status)) 
現在

,我怎麼能訪問一個頁面數組中的地圖,還是一步一步通過地圖?

{"status":"ok", 
    "pages":[ 
     { 
      "id":1, 
      "name":"name1", 
      "image":"imagename1.png", 
      "children":[ 
       { 
        "id":1, 
        "copytext":"kdjsldjsljfl" 
       }, 
       { 
        "id":2, 
        "copytext":"dksdöfksöfklsöf" 
       } 
      ] 
     }, 
     { 
      "id":2, 
      "name":"name1", 
      "image":"imagename1.png", 
      "children":[ 
       { 
        "id":4, 
        "copytext":"kdjsldjsljfl" 
       }, 
       { 
        "id":5, 
        "copytext":"dksdöfksöfklsöf" 
       } 
      ] 
     } 
    ] 
    } 

回答

1

對於嵌套的ClojureScript/JavaScript interop,您可以使用aget(即「array get」)。

例如,如果你想訪問你的「頁」陣列的第二個地圖項目,你可以這樣做:

(def my-js-object 
    (clj->js {:status "ok" 
      :pages [{:id 1 
        :name "foo" 
        :children []} 
        {:id 2 
        :name "bar" 
        :children []}]})) 

(aget my-js-object "pages" 1) 

在我簡單地使用clj->js構建名義上面的代碼(和不完整的)表示你的JSON;我希望這足以說明問題。

我REPL輸出是:

#js {:id 2, :name "bar", :children #js []} 

如果你想做一些與每個頁面的項目,如更復雜「地圖上每頁HashMap和拔出名值」,那麼你可以利用.- JS屬性訪問的

(->> (.-pages my-js-object) 
    (map #(.-name %))) 

REPL輸出:

("foo" "bar") 
+0

好的,我的鍵是字符串類型,我可以使用JS屬性訪問器? – bluelemonade

+0

是的,預計鑰匙將是字符串。你不應該有任何問題。即使我在我的示例中使用了字符串鍵,REPL也會如上所示輸出結果(使用JS數據結構的關鍵字表示形式)。 – Scott

+0

在REPL中嘗試一下;您可以在CLJS中同時使用關鍵字和字符串,這些關鍵字和字符串將轉換爲JS,但您將使用字符串通過aget訪問屬性。 – Scott