Maison > Java > javaDidacticiel > Comment utiliser un sérialiseur personnalisé avec Jackson ?

Comment utiliser un sérialiseur personnalisé avec Jackson ?

Barbara Streisand
Libérer: 2024-11-26 15:42:11
original
508 Les gens l'ont consulté

How do I use a custom serializer with Jackson?

Comment utiliser un sérialiseur personnalisé avec Jackson ?

Contexte

Pour personnaliser la sérialisation d'une classe Java à l'aide de Jackson, on peut définir un sérialiseur personnalisé qui étend le JsonSerializer classe.

Mise en œuvre

1. Créez un sérialiseur personnalisé pour l'article :

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

}
Copier après la connexion

2. Créez un module de sérialisation personnalisé et enregistrez le sérialiseur :

ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("SimpleModule", new Version(1,0,0,null));
simpleModule.addSerializer(new ItemSerializer());
mapper.registerModule(simpleModule);
Copier après la connexion

3. Sérialiser l'objet article :

StringWriter writer = new StringWriter();
mapper.writeValue(writer, myItem);
Copier après la connexion

Résolution du problème

L'erreur rencontrée lors de l'enregistrement du sérialiseur personnalisé (java.lang.IllegalArgumentException : JsonSerializer de type ... ne définit pas de valeur valide handledType()) indique que le sérialiseur ne spécifie pas le type qu'il gère.

Pour résoudre ce problème, assurez-vous que l'implémentation de JsonSerializer définit correctement sa méthode handledType().

Alternative : utiliser des annotations

Une approche alternative consiste à annoter un champ avec @ JsonSerialize(using = CustomSerializer.class) pour utiliser un sérialiseur spécifique.

Exemple : personnalisation Sérialisation des dates

Pour personnaliser la sérialisation des dates, créez un sérialiseur personnalisé qui étend 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);
    }

}
Copier après la connexion

Et puis ajoutez l'annotation au champ :

@JsonSerialize(using = CustomDateSerializer.class)
private Date createdAt;
Copier après la connexion

Cela permet pour un contrôle détaillé du processus de sérialisation et de désérialisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal