美文网首页
jackson自定义序列化中null值的处理2

jackson自定义序列化中null值的处理2

作者: 谁在烽烟彼岸 | 来源:发表于2018-10-25 19:10 被阅读0次

设置一个配置文件,用以注入自己的json工厂

@Configuration
  public class JsonConfig {
      @Bean
      public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
          final MappingJackson2HttpMessageConverter converter = new         MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = converter.getObjectMapper();
        // 为mapper注册一个带有SerializerModifier的Factory,此modifier主要做的事情为:当序列化类型为array,list、set时,当值为空时,序列化成[]
        mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
        return converter;
    }
}

再对需要处理的情况进行处理

 public class MyBeanSerializerModifier extends BeanSerializerModifier {
    private JsonSerializer<Object> _nullArrayJsonSerializer = new MyNullArrayJsonSerializer();
    private JsonSerializer<Object> _nullObjectJsonSerializer = new MyNullObjectJsonSerializer();
    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        // 循环所有的beanPropertyWriter
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = beanProperties.get(i);
            // 判断字段的类型,如果是array,list,set则注册nullSerializer
            if (isArrayType(writer)) {
                //给writer注册一个自己的nullSerializer
                writer.assignNullSerializer(this.defaultNullArrayJsonSerializer());
            }else if(isObjectType(writer)){
                writer.assignNullSerializer(this.defaultNullObjectJsonSerializer());
            }
        }
        return beanProperties;
    }
    private boolean isObjectType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getPropertyType();
        return !clazz.isPrimitive() && !clazz.equals(String.class)
                && clazz.isAssignableFrom(Object.class);
    }
    // 判断是什么类型
    protected boolean isArrayType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getPropertyType();
        return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
    }
    protected JsonSerializer<Object> defaultNullArrayJsonSerializer() {
        return _nullArrayJsonSerializer;
    }
    protected JsonSerializer<Object> defaultNullObjectJsonSerializer() {
        return _nullObjectJsonSerializer;
    }
}

相关文章

网友评论

      本文标题:jackson自定义序列化中null值的处理2

      本文链接:https://www.haomeiwen.com/subject/ezictqtx.html