2012-04-14 5 views
19

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

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

Мне нужно передать это через яваскрипт функцию, как

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

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

ответ

13

Я нашел функцию here

(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.

+3

Ваше преобразование карта эксплуатируя деталь реализации НЕКОТОРЫХ cljs карт. Это не всегда будет работать. Вместо этого используйте этот gist: https://gist.github.com/3153856 – Brian

+0

@Brian - похоже, что 'clj-> js' в вашем gist фактически не использует' map-> js' в вашем gist, если только Я пропустил это намерение? –

+0

@ Reb.Cabin Вы правы, моя вина. Исправлена. – Brian

37

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

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

+0

Отвечает ли он на вопрос? – cubuspl42

+1

Это: '(.stringify js/JSON (clj-> js {: key" value "}))' -> '" {\ "key \": \ "value \"} "' – LoG

6

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

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

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

(let [json (clj->json data-structure)] 
    ;; do something with json 
) 
+0

Мне нравится красиво -print my json при работе в тесте, чтобы он был более читабельным. Для этого добавьте аргументы в строку .stringify: '(.stringify js/JSON (clj-> js ds) nil 2)' nil - это заменитель, который не будет использоваться, а 2 означает два пробела для каждого уровня отступ. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify – Mnebuerquo

Смежные вопросы