2012-04-14 34 views
19

我有一些clojurescript,我想與一些javascript庫互操作。在我的clojurescript代碼中,我做了一些分析,並提出了一張地圖列表。 像如何在clojurescript中創建json

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

我需要這個傳遞給JavaScript函數的

[{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)) 

不正是我需要的。還有一個反函數,即ClojureScript核心中的js->clj

+3

你的地圖轉換就是利用一些cljs地圖的實現細節。它不會總是有效。改爲使用這個要點:https://gist.github.com/3153856 – Brian 2012-07-20 23:35:46

+0

@Brian - 看起來你的要點中的'clj-> js'實際上並沒有在你的要點中使用'map-> js',除非我錯過了意圖? – 2014-06-09 12:20:58

+0

@ Reb.Cabin你說得對,我的錯。固定。 – Brian 2014-06-09 16:46:26

37

只是爲了尋找類似的人。

ClojureScript核心現在包含clj->js函數。

+0

它回答這個問題嗎? – cubuspl42 2015-10-11 09:38:46

+1

它確實:'(.stringify js/JSON(clj-> js {:key「value」}))' - >'「{\」key \「:\」value \「}」' – LoG 2017-02-08 07:53:53

6

這個工作對我來說:

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

用法:

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

我喜歡漂亮 - 在測試中運行時打印我的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 2017-08-23 15:48:51