使用Clojure中的其他类型字段将记录编码为JSON对象

时间:2015-03-21 10:57:02

标签: clojure cheshire

Cheshire的自定义编码器似乎适合这个问题,我写了一个小帮手函数:

(defn add-rec-encoder [Rec type-token]
  (add-encoder Rec
    (fn [rec jg] (.writeString jg
      (str (encode-map (assoc rec :type type-token) jg))))))

(defrecord A [a])

(add-rec-encoder A "A")

(encode (->A "abc"))

但它会产生一个奇怪的尾随""

=> {"a":"abc","type":"A"} ""

造成这种情况的原因是什么?是否有另一种值得考虑的方法(我还需要能够根据此类型令牌解码回记录)?

1 个答案:

答案 0 :(得分:1)

(encode-map ... jg)直接将编码的地图写入JSON生成器jg,然后返回nil

这意味着,您对writeString的呼叫实际上是:

(.writeString jg (str nil))

,由于(str nil)"",因此将对JSON生成器进行编码和追加。正确的编码器逻辑是:

(defn add-rec-encoder [Rec type-token]
  (add-encoder Rec
    (fn [rec jg]
      (encode-map (assoc rec :type type-token) jg))))