Кодирование записей в виде объектов 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"} ""

Чем это вызвано? И есть ли другой подход, который стоит рассмотреть (мне также нужно иметь возможность декодировать обратно в запись на основе этого типа токена)?

1 ответ

Решение

(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))))
Другие вопросы по тегам