2012-04-14 19 views
19

Tengo algunos clojurescript que quiero interoperar con algunas bibliotecas de JavaScript. En mi código clojurescript hago algunos análisis y se me ocurre una lista de mapas. algo así comoCómo creo un json en clojurescript

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

tengo que pasar esta a unas funciones javascript como

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

No estoy seguro de cómo devolver un objeto de javascript formar mi función clojurescript sin embargo. ¿Hay alguna manera de serializar mapas y listas anidados a objetos JavaScript? ¿O una forma de crear un nuevo objeto javascript y luego establecer propiedades en él?

Respuesta

13

me encontré con una función 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)) 

hace exactamente lo que necesitaba. También existe la función inversa, es decir, js->clj en ClojureScript core.

+3

Su conversión mapa está explotando un detalle de implementación de algunos mapas cljs. No siempre funcionará. Use esta idea en su lugar: https://gist.github.com/3153856 – Brian

+0

@Brian - parece que 'clj-> js' en su esencia no usa en realidad el' map-> js' en su esencia, a menos que ¿Me perdí el intento? –

+0

@ Reb.Cabin Tienes razón, mi culpa. Fijo. – Brian

37

Solo por el bien de las personas que buscan algo similar.

El núcleo ClojureScript ahora contiene una función clj->js.

+0

¿Responde la pregunta? – cubuspl42

+1

Lo hace: '(.stringify js/JSON (clj-> js {: key" value "}))' -> '" {\ "clave \": \ "value \"} "' – LoG

6

Esto funciona para mí:

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

uso:

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

Me gusta bastante -imprime mi JSON cuando se ejecuta en prueba, por lo que es más legible. Para hacer esto, agregue argumentos a la línea .stringify: '(.stringify js/JSON (clj-> js ds) nil 2)' El nil es un sustituto que no se usará, y el 2 significa dos espacios para cada nivel de sangrar. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify – Mnebuerquo