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