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 に答える