在 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))))
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))))