SpringBoot响应实体类中响应值为null时字段被过滤
一、问题
在SpringBoot中使用了FastJson之后,响应结果的实体类如果字段为null,则会过滤字段显示。
二、解决方式
可以为FastJson配置一个HttpMessageConverter(消息转换对象),代码如下
@Configuration
public class FastJsonConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1.定义一个convert消息转换对象
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2.添加fastJson的序列化配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullListAsEmpty);
//3.处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//4.在convert中添加配置信息
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(fastJsonHttpMessageConverter);
}
}
关键点在于fastJsonConfig.setSerializerFeatures方法接收SerializerFeature对象
三、SerializerFeature说明
名称 | 含义 | 备注 |
---|---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true | |
UseSingleQuotes | 使用单引号而不是双引号,默认false | |
WriteMapNullValue | 是否输出值为null的字段,默认为false | |
WriteEnumUsingToString | 用枚举toString()值输出,默认为false | |
WriteEnumUsingName | 用枚举name()输出,默认为false | |
UseISO8601DateFormat | 数据用ISO8061的编码格式输出,默认为false | |
WriteNullListAsEmpty | List类型字段如果为null,则转换成[ ]空数组 | |
WriteNullStringAsEmpty | String类型字段如果为null,则转换成""空字符串 | |
WriteNullNumberAsZero | 数值类型字段如果为null,则转换成0 | |
WriteNullBooleanAsFalse | boolean类型字段如果为null,则转换成false | |
SkipTransientField | 序列化时忽略transient标记的字段,默认为true | |
SortField | 按字段名称排序后输出,默认false | |
WriteTabAsSpecial | 把"\t"作为转义输出,默认为flase | 已弃用 |
PrettyFormat | 格式化JSON格式,默认为false | |
WriteClassName | 序列化时写入类信息,默认为false。序列化时需要用到 | |
DisableCircularReferenceDetect | 消除对同一对象的循环引用,默认为false | |
WriteSlashAsSpecial | 对斜杠"/"进行转义 | |
BrowserCompatible | 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE6,默认为false | |
WriteDateUseDateFormat | 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); | |
NotWriteRootClassName | 序列化时不写入类信息 | |
DisableCheckSpecialChar | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false | |
BeanToArray | 将对象转为array输出 | |
WriteNonStringKeyAsString | 将属性key写为String | |
NotWriteDefaultValue | 不设默认值 | |
BrowserSecure | 防御xss安全攻击 | |
IgnoreNonFieldGetter | 忽略没有get方法的字段 | |
WriteNonStringValueAsString | 将不是string的key转换成string | |
IgnoreErrorGetter | 当获取值出错是忽略该值 | |
WriteBigDecimalAsPlain | 将BigDecimal类型转换成普通类型 | |
MapSortField | 对map字段进行排序 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下