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