À Jackson, les désérialiseurs personnalisés permettent d'étendre ou de modifier le comportement de désérialisation par défaut . Un besoin courant consiste à accéder au désérialiseur par défaut pour désérialiser partiellement un objet avant d'appliquer une logique personnalisée. Cependant, appeler directement deserialize depuis un désérialiseur personnalisé entraîne une exception de débordement de pile.
Pour résoudre ce problème, un BeanDeserializerModifier peut être implémenté et enregistré auprès d'un SimpleModule. Ce modificateur peut intervenir pendant le processus de création du désérialiseur et injecter le désérialiseur par défaut dans notre désérialiseur personnalisé.
Le code suivant montre comment y parvenir :
import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.module.BeanDeserializerModifier; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.util.StdDeserializer; public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer { private static final long serialVersionUID = 7923585097068641765L; 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; } // for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer // otherwise deserializing throws JsonMappingException?? @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt); } public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 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 module auprès d'ObjectMapper, la désérialisation personnalisée pour la classe User est activée, permettant l'accès au désérialiseur par défaut pour pré-remplissage de l'objet avant d'appliquer une logique personnalisée.
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!