Jackson - custom serializer that overrides only specific fields

后端 未结 5 1573
灰色年华
灰色年华 2020-12-09 10:01

I know how to use a custom serializer in Jackson (by extending JsonSerializer), but I want the default serializer to work for all fields, except for just 1 fiel

5条回答
  •  不思量自难忘°
    2020-12-09 10:51

    I faced the same issue, and I solved it with CustomSerializerFactory.

    This approach allows you to ignore some specific field for either for all objects, or for specific types.

    public class EntityCustomSerializationFactory extends CustomSerializerFactory {
    
        //ignored fields
        private static final Set IGNORED_FIELDS = new HashSet(
                Arrays.asList(
                        "class",
                        "value",
                        "some"
                )
        );
    
    
        public EntityCustomSerializationFactory() {
            super();
        }
    
        public EntityCustomSerializationFactory(Config config) {
            super(config);
        }
    
        @Override
        protected void processViews(SerializationConfig config, BeanSerializerBuilder builder) {
            super.processViews(config, builder);
    
            //ignore fields only for concrete class
            //note, that you can avoid or change this check
            if (builder.getBeanDescription().getBeanClass().equals(Entity.class)){
                //get original writer
                List originalWriters = builder.getProperties();
    
                //create actual writers
                List writers = new ArrayList();
    
                for (BeanPropertyWriter writer: originalWriters){
                    String propName = writer.getName();
    
                    //if it isn't ignored field, add to actual writers list
                    if (!IGNORED_FIELDS.contains(propName)){
                        writers.add(writer);
                    }
                }
    
                builder.setProperties(writers);
            }
    
        }
    }
    

    And afterwards you can use it something like the following:

    objectMapper.setSerializerFactory(new EntityCustomSerializationFactory());
    objectMapper.writeValueAsString(new Entity());//response will be without ignored fields
    

提交回复
热议问题