ホームページ >Java >&#&チュートリアル >Jackson でカスタム シリアライザーを使用するにはどうすればよいですか?

Jackson でカスタム シリアライザーを使用するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-26 15:42:11469ブラウズ

How do I use a custom serializer with Jackson?

Jackson でカスタム シリアライザーを使用するにはどうすればよいですか?

コンテキスト

Jackson を使用して Java クラスのシリアル化をカスタマイズするには、 JsonSerializer を拡張するカスタム シリアライザークラス。

実装

1.項目のカスタム シリアライザーを作成します:

public class ItemSerializer extends JsonSerializer<Item> {

    @Override
    public void serialize(Item value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeNumberField("id", value.id);
        jgen.writeNumberField("itemNr", value.itemNr);
        jgen.writeNumberField("createdBy", value.createdBy.id);
        jgen.writeEndObject();
    }

}

2.カスタム シリアル化モジュールを作成し、シリアライザーを登録します:

ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("SimpleModule", new Version(1,0,0,null));
simpleModule.addSerializer(new ItemSerializer());
mapper.registerModule(simpleModule);

3.項目オブジェクトをシリアル化します:

StringWriter writer = new StringWriter();
mapper.writeValue(writer, myItem);

問題の解決策

カスタム シリアライザーの登録時にエラーが発生しました (java.lang.IllegalArgumentException: JsonSerializer of type ... が有効な定義をしていません) handleType()) は、シリアライザーが処理する型を指定していないことを示します。

この問題を解決するには、JsonSerializer 実装で handlerType() メソッドが正しく定義されていることを確認してください。

代替: アノテーションの使用

代替アプローチは、フィールドに @ アノテーションを付けることです。 JsonSerialize(using = CustomSerializer.class) 特定のserializer.

例: 日付シリアル化のカスタマイズ

日付シリアル化をカスタマイズするには、SerializerBase を拡張するカスタム シリアライザーを作成します:

public class CustomDateSerializer extends SerializerBase<Date> {

    public CustomDateSerializer() {
        super(Date.class, true);
    }

    @Override
    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
        SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ (z)");
        String format = formatter.format(value);
        jgen.writeString(format);
    }

}

次に、フィールドに注釈を追加します。

@JsonSerialize(using = CustomDateSerializer.class)
private Date createdAt;

これにより、シリアル化と逆シリアル化を詳細に制御できます。プロセス。

以上がJackson でカスタム シリアライザーを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。