Maison >Java >javaDidacticiel >Comment accéder au désérialiseur Jackson par défaut dans un désérialiseur personnalisé ?

Comment accéder au désérialiseur Jackson par défaut dans un désérialiseur personnalisé ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 17:43:10702parcourir

How to Access the Default Jackson Deserializer within a Custom Deserializer?

Accès au désérialiseur par défaut dans le désérialiseur personnalisé de Jackson

Lors de la personnalisation de la désérialisation dans Jackson, il peut y avoir des scénarios dans lesquels vous devez tirer parti du comportement de désérialisation par défaut avant d'appliquer une logique personnalisée. Pour répondre à cette exigence, voici un guide complet pour accéder au désérialiseur par défaut à partir d'un désérialiseur personnalisé.

Considérez le scénario suivant :

public class UserEventDeserializer extends StdDeserializer<User> {

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

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

        User deserializedUser = null;
        try {
            deserializedUser = super.deserialize(jp, ctxt, new User());
        } catch (UnsupportedOperationException e) {
            // Access default Jackson deserializer here
        }
        // Perform custom logic on deserializedUser...

        return deserializedUser;
    }
}

Solution : BeanDeserializerModifier

L'approche recommandée pour accéder au désérialiseur par défaut consiste à utiliser un BeanDeserializerModifier. Cela vous permet de modifier le comportement par défaut de classes de bean spécifiques, dans ce cas, User.

public class UserDeserializerModifier extends BeanDeserializerModifier {

    @Override
    public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
        if (beanDesc.getBeanClass() == User.class) {
            return new JsonDeserializer<>(); // Default deserializer
        }
        return super.modifyDeserializer(config, beanDesc, deserializer);
    }
}

Exemple d'utilisation

Pour utiliser le modificateur personnalisé, enregistrez-le avec un SimpleModule et configurez-le sur votre ObjectMapper :

SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new UserDeserializerModifier());

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

Remarque : Implémentation ResolvableDeserializer peut être nécessaire pour éviter JsonMappingException lors de l'utilisation de cette approche.

Approches alternatives

Bien que BeanDeserializerModifier soit une solution fiable et flexible, voici quelques approches alternatives :

  • Remplacement AnnotationIntrospector : Cela implique d'étendre AnnotationIntrospector et de modifier le comportement des annotations comme @Transactional. Cependant, cela peut être plus complexe et ne pas toujours fonctionner comme prévu.
  • Utilisation de JsonDeserializerBuilder : Cette approche nécessite d'accéder au contexte de l'application depuis Spring et peut être moins simple que BeanDeserializerModifier.

Conclusion

Par See More en tirant parti de BeanDeserializerModifier, vous pouvez accéder et utiliser efficacement le désérialiseur Jackson par défaut dans votre désérialiseur personnalisé, permettant un comportement de désérialisation flexible et efficace.

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:
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