Rumah >Java >javaTutorial >Bagaimanakah cara saya menggunakan penyeri bersiri tersuai dengan Jackson?

Bagaimanakah cara saya menggunakan penyeri bersiri tersuai dengan Jackson?

Barbara Streisand
Barbara Streisandasal
2024-11-26 15:42:11509semak imbas

How do I use a custom serializer with Jackson?

Bagaimanakah saya boleh menggunakan Serializer tersuai dengan Jackson?

Konteks

Untuk menyesuaikan siri kelas Java menggunakan Jackson, seseorang boleh mentakrifkan penyeri tersuai yang memanjangkan JsonSerializer kelas.

Pelaksanaan

1. Buat Serializer Tersuai untuk Item:

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. Cipta Modul Pensiri Tersuai dan Daftar Pensiri:

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

3. Serialkan Objek Item:

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

Resolusi Isu

Ralat yang dihadapi semasa mendaftarkan serializer tersuai (java.lang.IllegalArgumentException: JsonSerializer of type ... tidak mentakrifkan sah handledType()) menunjukkan bahawa serializer tidak menyatakan jenis yang dikendalikannya.

Untuk menyelesaikan isu ini, pastikan pelaksanaan JsonSerializer mentakrifkan kaedah handledType()nya dengan betul.

Alternatif: Menggunakan Anotasi

Pendekatan alternatif ialah menganotasi medan dengan @ JsonSerialize(using = CustomSerializer.class) untuk menggunakan yang khusus serializer.

Contoh: Menyesuaikan Pensirian Tarikh

Untuk menyesuaikan penyirian tarikh, buat penyiri tersuai yang memanjangkan 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);
    }

}

Dan kemudian tambahkan anotasi pada medan:

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

Ini membenarkan kawalan terperinci ke atas pensirilan dan penyahserikan proses.

Atas ialah kandungan terperinci Bagaimanakah cara saya menggunakan penyeri bersiri tersuai dengan Jackson?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn