0

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"} ""

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

4

1 回答 1

1

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

这意味着,您的电话writeString实际上是:

(.writeString jg (str nil))

由于(str nil)is "",它将对其进行编码并将其准确地附加到 JSON 生成器。正确的编码器逻辑是:

(defn add-rec-encoder [Rec type-token]
  (add-encoder Rec
    (fn [rec jg]
      (encode-map (assoc rec :type type-token) jg))))
于 2015-03-21T14:46:29.937 回答