2012-04-14 26 views
19

Mam niektóre clojurescript, które chcę współdziałać z niektórych bibliotek javascript. W moim kodzie klątwy robię analizę i wymyślam listę map. cośJak utworzyć json w clojurescript?

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

muszę przekazać to do funkcji javascript, jak

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

Nie jestem pewien, jak wrócić javascript obiektu tworzą mój clojurescript funkcję chociaż. Czy istnieje sposób serializacji zagnieżdżonych map i list obiektów javascript. Lub sposób tworzenia nowego obiektu javascript, a następnie ustawiania na nim właściwości?

Odpowiedz

13

Znalazłem funkcję 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)) 

robi dokładnie to, co potrzebne. Istnieje również funkcja odwrotna, mianowicie js->clj w rdzeniu ClojureScript.

+3

konwersji mapa jest wykorzystanie szczegółów wdrażania niektórych cljs mapach. To nie zawsze działa. Skorzystaj z tego polecenia: https://gist.github.com/3153856 – Brian

+0

@Brian - wygląda na to, że 'clj-> js' w twoim tekście faktycznie nie używa' map-> js' w twoim tekście, chyba że Tęskniłem za intencją? –

+0

@ Reb.Cabin Masz rację, moja wina. Naprawiony. – Brian

37

Tylko ze względu na ludzi szukających czegoś podobnego.

Rdzeń ClojureScript zawiera teraz funkcję clj->js.

+0

Czy odpowiada na pytanie? – cubuspl42

+1

To robi: '(.stringify js/JSON (clj-> js {: klucz" value "}))' -> '" {\ "key \": \ "value \"} "' – LoG

6

Działa to dla mnie:

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

Wykorzystanie:

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

Lubię ładne -Podaj mój json, gdy uruchomiony w teście, dzięki czemu jest bardziej czytelny. Aby to zrobić, dodaj argumenty do linii .stringify: '(.stringify js/JSON (clj-> js ds) nil 2)' Nil jest zamiennikiem, który będzie nieużywany, a 2 oznacza dwa pola dla każdego poziomu akapit. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify – Mnebuerquo

Powiązane problemy