Maison > Java > javaDidacticiel > Comment appeler le désérialiseur par défaut de Jackson à partir d'un désérialiseur personnalisé ?

Comment appeler le désérialiseur par défaut de Jackson à partir d'un désérialiseur personnalisé ?

DDD
Libérer: 2024-12-01 01:20:11
original
418 Les gens l'ont consulté

How to Call Jackson's Default Deserializer from a Custom Deserializer?

Appel du désérialiseur par défaut à partir d'un désérialiseur personnalisé à Jackson

Problème :

Création d'un désérialiseur personnalisé à Jackson qui permet accès au désérialiseur par défaut pour pré-remplir les objets avant d'appliquer la personnalisation logique.

Code :

public class UserEventDeserializer extends StdDeserializer<User> {

    public UserEventDeserializer() {
        super(User.class);
    }

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
        
        // Line causing UnsupportedOperationException:
        User deserializedUser = super.deserialize(jp, ctxt, new User()); 
    }
}
Copier après la connexion

Solution :

Implémentez un BeanDeserializerModifier pour enregistrer un désérialiseur personnalisé pour un classe.

Code:

public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer {

    private final JsonDeserializer<?> defaultDeserializer;

    public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer) {
        super(User.class);
        this.defaultDeserializer = defaultDeserializer;
    }

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
        
        User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt);

        // Special logic

        return deserializedUser;
    }

    // Required when modifying BeanDeserializer
    @Override
    public void resolve(DeserializationContext ctxt) throws JsonMappingException {
        ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
    }

    public static void main(String[] args) throws Exception {
        SimpleModule module = new SimpleModule();
        module.setDeserializerModifier(new BeanDeserializerModifier() {
            @Override
            public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
                if (beanDesc.getBeanClass() == User.class)
                    return new UserEventDeserializer(deserializer);
                return deserializer;
            }
        });

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        User user = mapper.readValue(new File("test.json"), User.class);
    }
}
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal