程序员子龙(Java面试 + Java学习) 程序员子龙(Java面试 + Java学习)
首页
学习指南
工具
开源项目
技术书籍

程序员子龙

Java 开发从业者
首页
学习指南
工具
开源项目
技术书籍
  • 基础

  • JVM

  • Spring

    • 动态代理-CGLIB
    • Hibernate Validator 参数校验优雅实战
    • Jackson序列化json时null转成0或空串
      • 别自己瞎写工具类了!SpringBoot中自带工具类,开发效率增加一倍
      • Spring @Autowired Map
      • SpringBoot 缓存之 @Cacheable 详细介绍与失效时间TTL
      • Spring Security 入门
      • Spring Security原理
      • Spring项目整合MybatisPlus出现org.mybatis.logging.LoggerFactory Not Found 异常
      • Spring在代码中获取bean
      • 别再乱写了,Controller 层代码这样写才足够规范!
      • 非静态变量给静态变量赋值
      • 过滤器与拦截器区别、使用场景
      • 接口重试机制 Spring-Retry
      • 利用cglib动态创建对象或在原对象新增属性
      • 聊聊spring事务失效的场景
      • Spring Event 事件解耦
      • 最全的Spring依赖注入方式
      • Spring初始化之ApplicationRunner、InitializingBean、@PostConstruct 使用详解
      • 为啥不建议用 BeanUtils.copyProperties 拷贝数据
    • 并发编程

    • Mybatis

    • 网络编程

    • 数据库

    • 缓存

    • 设计模式

    • 分布式

    • 高并发

    • SpringBoot

    • SpringCloudAlibaba

    • Nginx

    • 面试

    • 生产问题

    • 系统设计

    • 消息中间件

    • Java
    • Spring
    程序员子龙
    2024-01-29
    目录

    Jackson序列化json时null转成0或空串

    在项目中可能会遇到null,转JSON时不希望出现null,可以添加下面的配置解决这个问题。

    # 全局处理

    定义bean解析器

    public class MyBeanSerializerModifier extends BeanSerializerModifier {
        public MyBeanSerializerModifier() {
        }
    
        @Override
    	public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
            beanProperties.forEach((writer) -> {
                if (!writer.hasNullSerializer()) {
                    JavaType type = writer.getType();
                    Class<?> clazz = type.getRawClass();
                    if (type.isTypeOrSubTypeOf(Number.class)) {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.NUMBER_JSON_SERIALIZER);
                    } else if (type.isTypeOrSubTypeOf(Boolean.class)) {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.BOOLEAN_JSON_SERIALIZER);
                    } else if (type.isTypeOrSubTypeOf(Character.class)) {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                    } else if (type.isTypeOrSubTypeOf(String.class)) {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                    } else if (!type.isArrayType() && !clazz.isArray() && !type.isTypeOrSubTypeOf(Collection.class)) {
                        if (type.isTypeOrSubTypeOf(OffsetDateTime.class)) {
                            writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                        } else if (!type.isTypeOrSubTypeOf(Date.class) && !type.isTypeOrSubTypeOf(TemporalAccessor.class)) {
                            writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.OBJECT_JSON_SERIALIZER);
                        } else {
                            writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                        }
                    } else {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.ARRAY_JSON_SERIALIZER);
                    }
    
                }
            });
            return super.changeProperties(config, beanDesc, beanProperties);
        }
    
        public interface NullJsonSerializers {
            JsonSerializer<Object> STRING_JSON_SERIALIZER = new JsonSerializer<Object>() {
                @Override
    			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeString("");
                }
            };
            JsonSerializer<Object> NUMBER_JSON_SERIALIZER = new JsonSerializer<Object>() {
                @Override
    			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeNumber(0);
                }
            };
            JsonSerializer<Object> BOOLEAN_JSON_SERIALIZER = new JsonSerializer<Object>() {
                @Override
    			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeObject(Boolean.FALSE);
                }
            };
            JsonSerializer<Object> ARRAY_JSON_SERIALIZER = new JsonSerializer<Object>() {
                @Override
    			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeStartArray();
                    gen.writeEndArray();
                }
            };
            JsonSerializer<Object> OBJECT_JSON_SERIALIZER = new JsonSerializer<Object>() {
                @Override
    			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeStartObject();
                    gen.writeEndObject();
                }
            };
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70

    配置message转换器

    public class MappingApiJackson2HttpMessageConverter extends AbstractReadWriteJackson2HttpMessageConverter {
    
        public MappingApiJackson2HttpMessageConverter(ObjectMapper objectMapper, MyJacksonProperties properties) {
            super(objectMapper, initWriteObjectMapper(objectMapper, properties), initMediaType(properties));
        }
    
        private static ObjectMapper initWriteObjectMapper(ObjectMapper readObjectMapper, JacksonProperties properties) {
            ObjectMapper writeObjectMapper = readObjectMapper.copy();
      
    		// 配置开关
            if (Boolean.TRUE.equals(properties.getNullToEmpty())) {
                writeObjectMapper.setSerializerFactory(writeObjectMapper.getSerializerFactory().withSerializerModifier(new BladeBeanSerializerModifier()));
                writeObjectMapper.getSerializerProvider().setNullValueSerializer(NullJsonSerializers.STRING_JSON_SERIALIZER);
            }
    
            return writeObjectMapper;
        }
    
    
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    配置开关:

    @ConfigurationProperties("jackson")
    public class JacksonProperties {
        private Boolean nullToEmpty;
    }   
    
    1
    2
    3
    4

    注册消息转换器:

    @Configuration(
        proxyBeanMethods = false
    )
    @Order(-2147483648)
    public class MessageConfiguration implements WebMvcConfigurer {
        private final ObjectMapper objectMapper;
        private final JacksonProperties properties;
    
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.removeIf((x) -> {
                return x instanceof StringHttpMessageConverter || x instanceof AbstractJackson2HttpMessageConverter;
            });
      
            converters.add(new MappingApiJackson2HttpMessageConverter(this.objectMapper, this.properties));
        }
        
         public MessageConfiguration(final ObjectMapper objectMapper, final JacksonProperties properties) {
            this.objectMapper = objectMapper;
            this.properties = properties;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    # 局部处理

    定义空系列化处理器:

    public class NumberNullSerialeze extends JsonSerializer<Object> {
    
       public static final int DEFULT_VALUE = 0;
    
       @Override
       public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
          gen.writeNumber(DEFULT_VALUE);
       }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    在字段上添加注解:

    @JsonSerialize(nullsUsing = NumberNullSerialeze.class)
    private Long availableAmt;
    
    1
    2
    上次更新: 2024/01/30, 15:08:57
    Hibernate Validator 参数校验优雅实战
    别自己瞎写工具类了!SpringBoot中自带工具类,开发效率增加一倍

    ← Hibernate Validator 参数校验优雅实战 别自己瞎写工具类了!SpringBoot中自带工具类,开发效率增加一倍→

    最近更新
    01
    一个注解,优雅的实现接口幂等性
    11-17
    02
    MySQL事务(超详细!!!)
    10-14
    03
    阿里二面:Kafka中如何保证消息的顺序性?这周被问到两次了
    10-09
    更多文章>
    Theme by Vdoing | Copyright © 2024-2024

        辽ICP备2023001503号-2

    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式