Как создать json в clojurescript

У меня есть clojurescript, который я хочу взаимодействовать с некоторыми библиотеками javascript. В своем коде на clojurescript я делаю некоторый анализ и составляю список карт. что-то типа

[{:prop1 "value1" :prop2 "value2"}, {:prop1 "something else" :prop2 "etc"}...]

Мне нужно передать это функциям javascript как

[{prop1: "value1", prop2: "value2}, {..} ...]

Я не уверен, как вернуть объект javascript из моей функции clojurescript. Есть ли способ сериализовать вложенные карты и списки в объекты javascript. Или способ создать новый объект javascript, а затем установить для него свойства?


person Stephen Olsen    schedule 14.04.2012    source источник


Ответы (3)


Просто ради людей, которые ищут что-то подобное.

Ядро ClojureScript теперь содержит функцию clj->js.

person Rodrigo Taboada    schedule 21.04.2013
comment
Это отвечает на вопрос? - person cubuspl42; 11.10.2015
comment
Он делает: (.stringify js/JSON (clj->js {:key "value"})) -> "{\"key\":\"value\"}" - person LoG; 08.02.2017

Я нашел функцию здесь

(defn clj->js
  "Recursively transforms ClojureScript maps into Javascript objects,
   other ClojureScript colls into JavaScript arrays, and ClojureScript
   keywords into JavaScript strings.

   Borrowed and updated from mmcgrana."
  [x]
  (cond
    (string? x) x
    (keyword? x) (name x)
    (map? x) (.-strobj (reduce (fn [m [k v]]
               (assoc m (clj->js k) (clj->js v))) {} x))
    (coll? x) (apply array (map clj->js x))
    :else x))

Делает именно то, что мне нужно. Есть и обратная функция, а именно js->clj в ядре ClojureScript.

person Stephen Olsen    schedule 17.04.2012
comment
Ваше преобразование карты использует детали реализации НЕКОТОРЫХ карт cljs. Это не всегда будет работать. Вместо этого используйте эту суть: gist.github.com/3153856 - person Brian; 21.07.2012
comment
@ Брайан - похоже, что clj->js в вашей сути на самом деле не использует map->js в вашей сути, если только я не пропустил намерение? - person Reb.Cabin; 09.06.2014

Это работает для меня:

(defn clj->json
  [ds]
  (.stringify js/JSON (clj->js ds)))

использование:

(let [json (clj->json data-structure)]
  ;; do something with json
  )
person Greg K    schedule 17.03.2015
comment
Мне нравится красиво печатать мой json при тестировании, чтобы он был более читабельным. Для этого добавьте аргументы в строку .stringify: (.stringify js/JSON (clj->js ds) nil 2) nil — это заменитель, который не будет использоваться, а 2 означает два пробела для каждого уровня отступа. developer.mozilla.org/en-US/ документы/Интернет/JavaScript/Справочник/ - person Mnebuerquo; 23.08.2017