将记录编码为JSON对象,并在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)直接将编码后的映射写入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))))

相关内容

  • 没有找到相关文章

最新更新