Heim > Java > javaLernprogramm > Wie rufe ich Jacksons Standard-Deserializer von einem benutzerdefinierten Deserializer aus auf?

Wie rufe ich Jacksons Standard-Deserializer von einem benutzerdefinierten Deserializer aus auf?

DDD
Freigeben: 2024-12-01 01:20:11
Original
310 Leute haben es durchsucht

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

Aufrufen des Standard-Deserializers von einem benutzerdefinierten Deserializer in Jackson

Problem:

Erstellen eines benutzerdefinierten Deserializers in Jackson, der dies ermöglicht Zugriff auf den Standard-Deserialisierer zum Vorabfüllen von Objekten vor der Anwendung von benutzerdefinierten Logik.

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()); 
    }
}
Nach dem Login kopieren

Lösung:

Implementieren Sie einen BeanDeserializerModifier, um einen benutzerdefinierten Deserializer für eine bestimmte zu registrieren Klasse.

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);
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie rufe ich Jacksons Standard-Deserializer von einem benutzerdefinierten Deserializer aus auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage