In Jackson ermöglichen benutzerdefinierte Deserialisierer das Erweitern oder Ändern des Standard-Deserialisiererverhaltens . Ein häufiger Bedarf besteht darin, auf den Standard-Deserialisierer zuzugreifen, um ein Objekt teilweise zu deserialisieren, bevor benutzerdefinierte Logik angewendet wird. Der direkte Aufruf von deserialize aus einem benutzerdefinierten Deserializer heraus führt jedoch zu einer Stapelüberlaufausnahme.
Um dieses Problem zu beheben, kann ein BeanDeserializerModifier implementiert und bei einem SimpleModule registriert werden. Dieser Modifikator kann während des Deserializer-Erstellungsprozesses eingreifen und den Standard-Deserializer in unseren benutzerdefinierten Deserializer einfügen.
Der folgende Code zeigt, wie dies erreicht wird:
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); } }
Durch die Registrierung dieses Moduls beim ObjectMapper wird die benutzerdefinierte Deserialisierung für die Benutzerklasse aktiviert und ermöglicht den Zugriff auf den Standard-Deserialisierer zum Vorabfüllen des Objekts vor der Anwendung benutzerdefinierter Logik.
Das obige ist der detaillierte Inhalt vonWie kann ich in einem benutzerdefinierten Jackson-Deserializer auf den Standard-Deserializer zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!