如何在ClojureScript中创建JSON

27

我有一些ClojureScript代码,想要与一些JavaScript库进行交互。在我的ClojureScript代码中,我做了一些分析,并得出了一个地图列表。 类似于:

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

我需要将这个传递给一个JavaScript函数

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

不确定如何从我的ClojureScript函数返回JavaScript对象。是否有一种方法将嵌套的映射和列表序列化为JavaScript对象?或者有没有一种方法可以创建一个新的JavaScript对象,然后在其上设置属性?

3个回答

49
只是为了那些寻找类似内容的人。
ClojureScript核心现在包含一个clj->js函数。

2
它是否回答了这个问题? - cubuspl42
10
这段代码的功能是:将Clojure中的数据结构{:key "value"}转换为JavaScript对象,然后使用JSON.stringify方法将其转换为字符串,最终输出为"{\"key\":\"value\"}" - LoG

17

我在这里找到了一个函数。

(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
@Brian -- 看起来你的gist中的clj->js实际上没有使用你的gist中的map->js,除非我错过了意图? - Reb.Cabin

12

这对我起作用:

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

使用方法:

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

2
我喜欢在测试运行时对我的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接