How do I call the default deserializer from a custom deserializer in Jackson

前端 未结 11 1134
野趣味
野趣味 2020-11-22 14:26

I have a problem in my custom deserializer in Jackson. I want to access the default serializer to populate the object I am deserializing into. After the population I will do

11条回答
  •  误落风尘
    2020-11-22 14:48

    Along the lines of what Tomáš Záluský has suggested, in cases where using BeanDeserializerModifier is undesirable you can construct a default deserializer yourself using BeanDeserializerFactory, although there is some extra setup necessary. In context, this solution would look like so:

    public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {
    
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);
        User deserializedUser = null;
    
        DeserializationConfig config = ctxt.getConfig();
        JavaType type = TypeFactory.defaultInstance().constructType(User.class);
        JsonDeserializer defaultDeserializer = BeanDeserializerFactory.instance.buildBeanDeserializer(ctxt, type, config.introspect(type));
    
        if (defaultDeserializer instanceof ResolvableDeserializer) {
            ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
        }
    
        JsonParser treeParser = oc.treeAsTokens(node);
        config.initialize(treeParser);
    
        if (treeParser.getCurrentToken() == null) {
            treeParser.nextToken();
        }
    
        deserializedUser = (User) defaultDeserializer.deserialize(treeParser, context);
    
        return deserializedUser;
    }
    
        

    提交回复
    热议问题