How use jackson ObjectMapper inside custom deserializer?

前端 未结 3 578
野性不改
野性不改 2020-12-31 02:56

I try to write custom jackson deserializer. I want \"look\" at one field and perform auto deserialization to class, see example below:

import com.fasterxml.j         


        
3条回答
  •  清酒与你
    2020-12-31 03:15

    In order to use your own ObjectMapper inside a custom deserializer, you can use Jackson Mix-in Annotations (the DefaultJsonDeserializer interface) to dynamically remove the custom deserializer from the POJO classes, avoiding the StackOverflowError that would otherwise be thrown as a result of objectMapper.readValue(JsonParser, Class).

    public class MyDeserializer extends JsonDeserializer {
    
        private static final ObjectMapper objectMapper = new ObjectMapper();
    
        static {
            objectMapper.addMixIn(MySuccess.class, DefaultJsonDeserializer.class);
            objectMapper.addMixIn(MyFailure.class, DefaultJsonDeserializer.class);
        }
    
        @Override
        public MyInterface deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
            if (jp.getCodec().readTree(jp).has("custom_field")) {
                return objectMapper.readValue(jp, MyFailure.class);
            } else {
                return objectMapper.readValue(jp, MySuccess.class);
            }           
        }
    
        @JsonDeserialize
        private interface DefaultJsonDeserializer {
            // Reset default json deserializer
        }
    
    }
    

提交回复
热议问题