2012-04-14 9 views
19

いくつかのjavascriptライブラリと相互運用したいクロージャスクリプトがあります。私のクローズコピーコードでは、いくつかの分析を行い、マップのリストを用意しています。クロージャスクリプトでjsonを作成する方法

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

よう 何かが私はjavascriptオブジェクトはしかし私のclojurescript機能を形成返却するかどうかはわかりません

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

としてのjavascript機能にこれを渡す必要があります。ネストされたマップとリストを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

+0

@Brian - あなたの要点で 'clj-> js'のように見えますが、あなたの要点で' map-> js'を実際に使っていない私はその意図を忘れた? –

+0

@ Reb.Cabinあなたは正しいです、私のせいです。一定。 – Brian

37

似たようなものを探している人のためだけです。

ClojureScriptコアには、clj->js機能が追加されました。

+0

質問に答えますか? – cubuspl42

+1

それは: '' .stringify js/JSON(clj-> js {:key "value"})) '' \ {key \ ":\"値\ "}" ' – LoG

6

これが私の作品:

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

は、用法:

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

テストで実行しているときに私のjsonを表示すると、読みやすくなります。 '.stringify js/JSON(clj-> js ds)nil 2)' nilは未使用の置換えであり、2は各レベルの2つの空白を意味します。インデント。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify – Mnebuerquo

関連する問題