Heim >Java >javaLernprogramm >Wie verwende ich einen benutzerdefinierten Serialisierer mit Jackson?

Wie verwende ich einen benutzerdefinierten Serialisierer mit Jackson?

Barbara Streisand
Barbara StreisandOriginal
2024-11-26 15:42:11509Durchsuche

How do I use a custom serializer with Jackson?

Wie verwende ich einen benutzerdefinierten Serializer mit Jackson?

Kontext

Um die Serialisierung einer Java-Klasse mit Jackson anzupassen, kann man einen definieren Benutzerdefinierter Serializer, der den JsonSerializer erweitert Klasse.

Implementierung

1. Erstellen Sie einen benutzerdefinierten Serializer für Artikel:

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. Erstellen Sie ein benutzerdefiniertes Serialisierungsmodul und registrieren Sie den Serializer:

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

3. Serialisieren Sie das Artikelobjekt:

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

Problemlösung

Der Fehler ist beim Registrieren des benutzerdefinierten Serialisierers aufgetreten (java.lang.IllegalArgumentException: JsonSerializer vom Typ ... definiert nicht gültig handledType()) gibt an, dass der Serialisierer den Typ, den er verarbeitet, nicht angibt.

Um dieses Problem zu beheben, stellen Sie sicher, dass die JsonSerializer-Implementierung ihre handledType()-Methode korrekt definiert.

Alternative: Verwendung von Anmerkungen

Ein alternativer Ansatz besteht darin, ein Feld mit @ zu kommentieren. JsonSerialize(using = CustomSerializer.class) zur Verwendung eines bestimmten Serializer.

Beispiel: Anpassen der Datumsserialisierung

Um die Datumsserialisierung anzupassen, erstellen Sie einen benutzerdefinierten Serializer, der SerializerBase erweitert:

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);
    }

}

Und fügen Sie dann die Anmerkung zum Feld hinzu:

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

Dies ermöglicht eine detaillierte Kontrolle über den Serialisierungs- und Deserialisierungsprozess.

Das obige ist der detaillierte Inhalt vonWie verwende ich einen benutzerdefinierten Serialisierer mit Jackson?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:H lustige Tests im FrühlingNächster Artikel:H lustige Tests im Frühling