我有一個列表如下圖所示(某種排名數據,列表是按順序):如何在Clojure中將列表轉換爲JSON?
'(John Kelly Daniel)
,並希望將其轉換成JSON象下面這樣:
[{"rank":1, "name":"John"},{"rank":2, "name":"Kelly"},{"rank":3, "name":"Daniel"}]
什麼是最簡單的最簡單的方式使用json/write-str來做到這一點?
我有一個列表如下圖所示(某種排名數據,列表是按順序):如何在Clojure中將列表轉換爲JSON?
'(John Kelly Daniel)
,並希望將其轉換成JSON象下面這樣:
[{"rank":1, "name":"John"},{"rank":2, "name":"Kelly"},{"rank":3, "name":"Daniel"}]
什麼是最簡單的最簡單的方式使用json/write-str來做到這一點?
至於@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)
可以使用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}]
像這樣:'(map-indexed#(hash-map:rank(inc%1):name(str%2))'(John Kelly Dan iel))',然後將它傳遞給'json/write-string',但我建議你先閱讀語言基礎知識 – leetwinski