2011-07-13 32 views
4

我想在clojure中編寫一個通用的serilization函數。像這樣將輸入映射序列化爲字符串

(def input-map {:Name "Ashwani" :Title "Dev"}) 
(defn serialize [input-map delimiter] 
...rest of the code 
) 

叫時,以下哪

(serialize input-map ",") Produces 
Ashwani,Dev 

,我有一些事情的,現在它需要在地圖的特定的密鑰,但做到這一點

(defn serialize [input-map] 
    (map #(str (% :Name) "," (% :Title) "\n") input-map)) 

我想避免的是硬編碼名稱和標題。必須有一些方法來使用反射或某些東西來實現這一點,但不幸的是我不知道有足夠的clojure來完成這件事。

+0

我很困惑你如何使用「序列化」。一般來說,序列化意味着能夠從輸出中重建數據,但根本不保存密鑰。此外,如果您希望該函數爲通用函數,但不自行輸出密鑰,則仍然需要爲該函數提供密鑰,以便可以控制它們輸出的順序。 –

+0

@Alex - 從overthink下面的答案做我需要的,我寫的問題清楚地說明了我想達到的目標。如果您遇到「Serliaze」字樣的問題,可以稱其爲「Foo」。 – Ash

+0

我的歉意是,我之前的評論顯然是過分嚴重的,這是我的一個常見失誤。我的意圖是幫助提出一個更清晰的問題,以防你沒有得到你需要的答案。如果你有什麼需要,那麼很好。 –

回答

3

這給一個鏡頭:

(require 'clojure.string) 
(defn serialize [m sep] (str (clojure.string/join sep (map (fn [[_ v]] v) m)) "\n")) 
(def input-map {:Name "Ashwani" :Title "Dev"}) 
(serialize input-map ",") 

產生

"Ashwani,Dev\n" 

不知道如何慣用這個,但它應該爲你工作。

更新:Julien's answer比我的好! vals ...我怎麼會錯過:)

0

「正常」clojure類型可以使用pr-str進行序列化並使用讀取字符串重新設置。除非你有理由用你描述的特定方式來格式化你的序列化數據,否則我建議使用pr-str,因爲它的輸出更具可讀性。

+0

我有一個地圖列表,我想從它們中獲取值並寫入CSV文件,所以上述方法是我需要的,但將這個應用於defstruct會給我錯誤,因爲現在.. – Ash

5
(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"]))) 
2

它退出簡單。

(str input-map) 
相關問題