在 Clojure 中将记录编码为具有附加类型字段的 JSON 对象

Encoding records as JSON objects with additional type field in Clojure

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)直接将编码后的map写入JSON生成器jg,然后returnsnil.

这意味着,您对 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))))