Доступ к массиву в данных Json с помощью Clojurescript
Я новый Clojurescript и хочу взломать Clojurescript и электрон на основе небольшого файла JSON.
Я делаю что-то вроде (с транзитом /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"
}
]
}
]
}
2 ответа
Ты можешь использовать aget
(то есть "массив get") для вложенного взаимодействия ClojureScript / JavaScript.
Например, если вы хотите получить доступ ко второму элементу карты в вашем массиве "pages", вы можете сделать это:
(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 []}
Если вы хотите сделать что-то более сложное с каждым элементом страницы, например, "отобразить хэш-карту каждой страницы и вытащить значения имени", то вы можете использовать .-
JS свойство accessor
(->> (.-pages my-js-object)
(map #(.-name %)))
REPL выход:
("foo" "bar")
Чтобы не ответить на вопрос, вы можете использовать js-> cljs, https://cljs.github.io/api/cljs.core/js-GTclj, чтобы превратить ваш json в обычную структуру данных Clojure и использовать Clojures normal fns для извлечь данные, которые вы хотите.