如何在clojurescript中创建json

Ste*_*sen 21 clojurescript

我有一些clojurescript,我想与一些JavaScript库互操作.在我的clojurescript代码中,我做了一些分析,并提出了一个地图列表.就像是

[{:prop1 "value1" :prop2 "value2"}, {:prop1 "something else" :prop2 "etc"}...]
Run Code Online (Sandbox Code Playgroud)

我需要将它传递给javascript函数as

[{prop1: "value1", prop2: "value2}, {..} ...]
Run Code Online (Sandbox Code Playgroud)

我不知道如何从我的clojurescript函数返回一个javascript对象.有没有办法将嵌套的地图和列表序列化为javascript对象.或者一种创建新javascript对象然后在其上设置属性的方法?

Rod*_*ada 42

只是为了寻找类似的东西.

ClojureScript核心现在包含一个clj->js函数.

  • 它确实:`(.stringify js/JSON(clj-> js {:key"value"}))` - >`"{\"key \":\"value \"}"` (3认同)
  • 它回答了这个问题吗? (2认同)

Ste*_*sen 15

我在这里找到了一个功能

(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))
Run Code Online (Sandbox Code Playgroud)

完全符合我的需要.还有反函数,即js->clj在ClojureScript核心中.

  • 您的地图转换正在利用SOME cljs地图的实现细节.它并不总是有效.请改用这个要点:https://gist.github.com/3153856 (3认同)

Gre*_*g K 8

这对我有用:

(defn clj->json
  [ds]
  (.stringify js/JSON (clj->js ds)))
Run Code Online (Sandbox Code Playgroud)

用法:

(let [json (clj->json data-structure)]
  ;; do something with json
  )
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢在测试中运行时漂亮地打印我的 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 (2认同)