如何在Clojure中将列表转换为JSON?

时间:2017-01-16 06:11:46

标签: json clojure

我有一个如下所示的列表(某种排名数据,列表是有序的):

'(John Kelly Daniel)

并希望将其转换为JSON,如下所示:

[{"rank":1, "name":"John"},{"rank":2, "name":"Kelly"},{"rank":3, "name":"Daniel"}]

最后使用json / write-str最简单最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

作为@leetwinski答案的补充(并使用他们的代码)

(ns some-thing.core
  (:require [cheshire.core :refer :all]))

(def names '(John Kelly Daniel))

(defn add-rank [data]
  (map-indexed #(hash-map :rank (inc %1) :name (str %2)) data))

(-> names
    add-rank
    generate-string)

答案 1 :(得分:0)

您可以使用mapv来创建具有一个等级和一个名称的地图,并使用库cheshire将该向量转换为json。在Clojure中使用数据列表并不是惯用的,所以我建议你改用矢量。

(ns rankifier.core
  (:require [cheshire.core :refer [generate-string]]))

(defn rankify [names]
  (mapv #(hash-map :name %1 :rank %2)
        names
        (range 1 (inc (count names)))))

在命名空间声明中,我们只需要cheshire的函数generate-string。 然后我们定义函数rankify,它以向量names作为参数,并返回一个哈希映射向量,每个哈希映射包含一个名称和一个等级,其中第一个名称的等级为1,对于所有给定的名称,第二个名称是2,依此类推。

我们可以使用线程优先宏来尝试这样做:

rankifier.core> (-> ["John" "Kelly" "Daniel"]
                    rankify
                    generate-string)
"[{\"name\":\"John\",\"rank\":1},{\"name\":\"Kelly\",\"rank\":2},    {\"name\":\"Daniel\",\"rank\":3}]"

如果我们没有将其转换为json,结果将如下所示:

rankifier.core> (rankify ["John" "Kelly" "Daniel"])
[{:name "John", :rank 1} {:name "Kelly", :rank 2} {:name "Daniel", :rank 3}]

这适用于任意数量的名称:

(rankify ["John" "Kelly" "Daniel" "Maria" "Billy" "Amy"])
[{:name "John", :rank 1}
 {:name "Kelly", :rank 2}
 {:name "Daniel", :rank 3}
 {:name "Maria", :rank 4}
 {:name "Billy", :rank 5}
 {:name "Amy", :rank 6}]