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"} ""
造成这种情况的原因是什么?是否有另一种值得考虑的方法(我还需要能够根据此类型令牌解码回记录)?
答案 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))))