私は特定の形式、すなわち"[lower,upper)"
でシリアル化する必要があるRange
を持っています。ジャクソンで範囲をシリアライズ
public class RangeSerializer extends StdSerializer<Range<?>> {
@Override
public void serialize(final Range<?> value, final JsonGenerator gen, final SerializerProvider provider) throws IOException {
if (value != null) {
gen.writeRaw('"');
gen.writeRaw('[');
provider.defaultSerializeValue(value.lowerEndpoint(), gen);
gen.writeRaw(',');
provider.defaultSerializeValue(value.upperEndpoint(), gen);
gen.writeRaw(')');
gen.writeRaw('"');
}
}
(つまり、実際にシリアライザは、このようなオープン/クローズの範囲、どちらかの端などではなくのための無限の範囲の可能性としてRange
の様々な可能性を扱う注:私は書かれているので、基本的なシリアライザを行うには私の質問の目的は関係ないので、コードを単純にするために削除しました)。
私の問題は、各クラスのデフォルトのシリアライザに戻って、間違った場所で引用符で終わることです。たとえば、私がのエントリが"[foo,bar)"
の場合、それをシリアル化すると"["foo","bar")"
が得られます。下位と上位のエンドポイント値を引用符なしに結果が必要です。
基本的なシリアライザのgen.writeString()
は、それが既に文字列内にあることを認識しないため、追加の引用符があることを理解します。ジェネレーターにこれを知らせるための方法や、私がしようとしていることを達成するための代替方法がありますか?
Range<?>
は実際には一般的なので、値のシリアル化をハードコーディングすることはできません。 Range<Integer>
、Range<String>
、Range<DateTime>
、その他のもので動作する必要があります。
回答ありがとうございます。 Aコンバータは興味深い方法ですが、シリアライザやデシリアライザを登録できるのと同じ方法で登録することができますか、または注釈を付ける必要がありますか? Rangeクラス自体にアクセスすることはできません。その範囲は実際にマップのキーとして使用されているので、アノテーションベースのソリューションが私に役立つかどうかはわかりません。 – jgm
Mixinを使用して、注釈をRangeクラスに追加します。私は答えを編集してどのように表示したのですか? mapperで設定された 'addMixin(...)'部分に注目してください。 –