2017-01-16 123 views
0

我有一个列表如下图所示(某种排名数据,列表是按顺序):如何在Clojure中将列表转换为JSON?

'(John Kelly Daniel) 

,并希望将其转换成JSON象下面这样:

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

什么是最简单的最简单的方式使用json/write-str来做到这一点?

+1

像这样:'(map-indexed#(hash-map:rank(inc%1):name(str%2))'(John Kelly Dan iel))',然后将它传递给'json/write-string',但我建议你先阅读语言基础知识 – leetwinski

回答

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) 
0

可以使用mapv来创建一个等级,一个名字映射做到这一点,和库柴郡向量转换为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))))) 

在命名空间声明,我们只需要柴郡的功能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}] 
相关问题