使用Clojurescript访问Json Data中的数组

时间:2017-04-10 17:03:54

标签: clojurescript transit

我是新的Clojurescript,想要根据一个小的json文件来破解clojurescript和电子。

我正在做类似的事情(使用transit / 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))

现在,我如何访问pages数组中的一个地图,或者逐步浏览地图?

{"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"
                }
            ]
        }
    ]
   }

2 个答案:

答案 0 :(得分:1)

您可以对嵌套的ClojureScript / JavaScript互操作使用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")

答案 1 :(得分:0)

如果不回答这个问题,你可以使用 js-> cljs,https://cljs.github.io/api/cljs.core/js-GTclj,将您的json转换为正常的Clojure数据结构,并使用Clojures普通fns提取您想要的数据。