Доступ к массиву в данных 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 для извлечь данные, которые вы хотите.

Другие вопросы по тегам