将输入映射序列化为字符串

时间:2011-07-13 13:33:54

标签: clojure

我正在尝试在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来完成这项工作。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

试一试:

(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 ...我怎么能错过这个:)。

答案 2 :(得分:3)

这很简单。

(str input-map)

答案 3 :(得分:0)

“普通”clojure类型可以使用pr-str序列化并使用read-string重新设置。除非你有理由以你描述的特定方式格式化序列化数据,否则我建议使用pr-str,因为它的输出更具可读性。