2012-04-14 11 views
19

Ho qualche clojurescript che voglio usare con alcune librerie javascript. Nel mio codice clojurescript faccio delle analisi e trovo una lista di mappe. qualcosa comeCome faccio a creare un json in clojurescript

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

ho bisogno di passare questo per un funzioni JavaScript come

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

Non sono sicuro di come restituire un oggetto JavaScript Form mia funzione ClojureScript però. C'è un modo per serializzare mappe nidificate ed elenchi di oggetti javascript. O un modo per creare un nuovo oggetto javascript e quindi impostare le proprietà su di esso?

risposta

13

ho trovato una funzione 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)) 

fa esattamente quello che mi serviva. Esiste anche la funzione inversa, ovvero js->clj nel core ClojureScript.

+3

vostra conversione mappa sta sfruttando un dettaglio di implementazione di alcune mappe cljs. Non funzionerà sempre. Usa invece questo aspetto: https://gist.github.com/3153856 – Brian

+0

@Brian - sembra che il 'clj-> js' nel tuo gist non usi effettivamente' map-> js' nel tuo gist, a meno che Ho perso l'intento? –

+0

@ Reb.Cabin Hai ragione, colpa mia. Fisso. – Brian

37

Solo per il gusto di persone che cercano qualcosa di simile.

Il core ClojureScript ora contiene una funzione clj->js.

+0

Risponde alla domanda? – cubuspl42

+1

Fa: '(.stringify js/JSON (clj-> js {: chiave" valore "}))' -> '" {\ "chiave \": \ "valore \"} "' – LoG

6

questo funziona per me:

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

utilizzo:

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

Mi piace molto -print my json quando è in esecuzione in test quindi è più leggibile. Per fare ciò, aggiungi argomenti alla linea .stringify: '(.stringify js/JSON (clj-> js ds) nil 2)' Il nil è un sostituto che non sarà usato, e il 2 significa due spazi per ogni livello di trattino. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify – Mnebuerquo

Problemi correlati