Maison >Java >javaDidacticiel >Comment tirer parti du désérialiseur par défaut de Jackson dans un désérialiseur personnalisé ?

Comment tirer parti du désérialiseur par défaut de Jackson dans un désérialiseur personnalisé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-10 09:16:12885parcourir

How to Leverage Jackson's Default Deserializer within a Custom Deserializer?

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

Lors de la personnalisation de la désérialisation dans Jackson, vous devrez peut-être accéder à la valeur par défaut désérialiseur pour remplir votre objet. Ceci peut être réalisé en employant un BeanDeserializerModifier et en l'enregistrant via un SimpleModule.

Voici un exemple d'implémentation :

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

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

En enregistrant ce modificateur, vous pouvez accéder au désérialiseur par défaut et pré-remplir votre objet dans votre désérialiseur personnalisé sans provoquer d'exception.

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