Jackson Dynamic filtering of properties during deserialization

后端 未结 4 464
梦毁少年i
梦毁少年i 2020-12-10 06:06

I have a REST WS to update a bean object which receives a JSON string as input.

ABean entity = svc.findEntity(...);
objectMapper.readerForUpdating(entity).r         


        
4条回答
  •  感动是毒
    2020-12-10 06:30

    Another way is using BeanDeserializerModifier:

    private static class BeanDeserializerModifierForIgnorables extends BeanDeserializerModifier {
    
            private java.lang.Class type;
            private List ignorables;
    
            public BeanDeserializerModifierForIgnorables(java.lang.Class clazz, String... properties) {
                ignorables = new ArrayList<>();
                for(String property : properties) {
                    ignorables.add(property);
                }
                this.type = clazz;
            }
    
            @Override
            public BeanDeserializerBuilder updateBuilder(
                    DeserializationConfig config, BeanDescription beanDesc,
                    BeanDeserializerBuilder builder) {
                if(!type.equals(beanDesc.getBeanClass())) {
                    return builder;
                }
    
                for(String ignorable : ignorables) {
                    builder.addIgnorable(ignorable);                
                }
    
                return builder;
            }
    
            @Override
            public List updateProperties(
                    DeserializationConfig config, BeanDescription beanDesc,
                    List propDefs) {
                if(!type.equals(beanDesc.getBeanClass())) {
                    return propDefs;
                }
    
                List newPropDefs = new ArrayList<>();
                for(BeanPropertyDefinition propDef : propDefs) {
                    if(!ignorables.contains(propDef.getName())) {
                        newPropDefs.add(propDef);
                    }
                }
                return newPropDefs;
            }
        }
    

    You can register the modfier to the ObjectMapper with:

    BeanDeserializerModifier modifier = new BeanDeserializerModifierForIgnorables(YourType.class, "name");
    DeserializerFactory dFactory = BeanDeserializerFactory.instance.withDeserializerModifier(modifier);
    ObjectMapper mapper = new ObjectMapper(null, null, new DefaultDeserializationContext.Impl(dFactory));
    

    Then the defined properties are ignored. You can ignore the updateBuilder method if you use the @JsonAnySetter annotation.

    Greetings, Martin

提交回复
热议问题