springboot中Jackson处理返回数据格式处理方案汇总

1.常见格式处理场景

    1.为null的字段不允许返回给前端,要求不返回为null字段
    2.为null的字段不允许返回给前端,要求为null字段返回,设置为空字符串
    3.不为null字符串转化为自定义的字符串格式

2.对应处理方案

1.为null的字段不允许返回给前端,要求不返回为null字段

    局部处理方案:具体字段上添加注解:@JsonInclude(JsonInclude.Include.NON_NULL),仅对注解所在字段生效.
    全局处理方案:springboot配置文件(yml)中添加配置(整个项目中所有为null的字段都将不显示):

		spring:
				jackson:
					default-property-inclusion: non_null

2.为null的字段不允许返回给前端,要求为null字段返回,设置为空字符串

配置类:

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

3.不为null字符串转化为自定义的字符串格式

@JsonSerialize或@JsonFormat
具体使用方式参考: mybatis返回日期有.0的处理方案.

4.对为null场景转化为字符串为什么不能使用@JsonSerialize进行处理原因分析
    Jackson包中BeanPropertyWriter.java中有以下两个序列化处理器:

 	// 值为非null的序列化处理器
    protected JsonSerializer<Object> _serializer;

	// 值为null的序列化处理器,默认返回null值
    protected JsonSerializer<Object> _nullSerializer;

    BeanPropertyWriter.java中serializeAsField方法对请求响应对象中每个字段执行序列化操作,如果字段为null会执行会由_nullSerializer序列化为null;非null则按照指定的序列化方式进行序列化处理(一般根据业务需求自定义序列化器实现)

public void serializeAsField(Object bean, JsonGenerator gen,
        SerializerProvider prov) throws Exception {
    // inlined 'get()'
    final Object value = (_accessorMethod == null) ? _field.get(bean)
            : _accessorMethod.invoke(bean, (Object[]) null);

    // 字段为null,_nullSerializer将该字段序列化为null
    if (value == null) {
        if (_nullSerializer != null) {
            gen.writeFieldName(_name);
            _nullSerializer.serialize(null, gen, prov);
        }
        return;
    }
    // 省略部分代码................
    if (_typeSerializer == null) {
    	// 对于字段返回值为非null序列化操作,具体序列化方式可以自定义实现(自定义序列化类继承JsonSerializer<Object>重写serialize)
        ser.serialize(value, gen, prov);
    } else {
        ser.serializeWithType(value, gen, prov, _typeSerializer);
    }
}

    欢迎评论区留言讨论,技术成长路上相互帮助相互提高!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值