Using conditions to dynamically exclude POJO property in Jackson json serialization

前端 未结 3 1861
梦谈多话
梦谈多话 2020-12-11 10:21

I have a requirement to dynamically exclude certain property within a List of a defined POJO. The main POJO to be serialized is:

public class Foo
{
    List&         


        
3条回答
  •  执念已碎
    2020-12-11 10:47

    I just saw the culprit. Thanks a lot @Alexey for staying with me on this. After much try, I discover Jackson 2.4.2 might have required that I place my serialzer within the model it would work with. I wonder why though, but probably due to Java object serialization requirements, Jackson was failing to map the Filter at runtime. I hope Tatu would note this in Jackson documentation

    public class PostProject
    {
        /* The field template of this project */
        private List< FieldTemplateObject > field_templates;
    
        /**
         * @author Damilola Okuboyejo
         */
        @JsonFilter( "FieldTemplateIdFilter" )
        public static class FieldTemplateObject
        {
          private int     id;
          private boolean is_inherited;
          private String  item_type;
    
          /**
           * @return the id
           */
          public int getId()
          {
             return id;
          }
    
          /**
           * @param id
           *           the id to set
           */
          public void setId( int id )
          {
             this.id = id;
          }
    
          /**
           * @return the is_inherited
           */
          public boolean isIs_inherited()
          {
             return is_inherited;
          }
    
          /**
           * @param is_inherited
           *           the is_inherited to set
           */
          public void setIs_inherited( boolean is_inherited )
          {
             this.is_inherited = is_inherited;
          }
    
          /**
           * @return the item_type
           */
          public String getItem_type()
          {          
             return item_type;
          }
    
          /**
           * @param item_type
           *           the item_type to set
           */
          public void setItem_type( String item_type )
          {
             this.item_type = item_type;
          }
       }
    
       public static class ModelFieldSerializer extends SimpleBeanPropertyFilter
       {
          @Override
          protected boolean include( BeanPropertyWriter writer )
          {
             return true;
          }
    
          @Override
          protected boolean include( PropertyWriter writer )
          {
             return true;
          }
    
          @Override
          public void serializeAsField( Object pPojo, JsonGenerator pJgen,
                SerializerProvider pProvider, PropertyWriter pWriter )
                throws Exception
          {
             if( pPojo instanceof FieldTemplateObject )
             {
                 boolean vAllowId = ((FieldTemplateObject) pPojo).isIs_inherited();
                 if( !vAllowId && ("id".equals( pWriter.getName() )) )
                 {
                   return; // skip the id property
                 }
                 else
                 {
                   super.serializeAsField( pPojo, pJgen, pProvider, pWriter );
                 }
             }
          }
        }
    }
    

提交回复
热议问题