SpringMvc中返回json时对象属性为空也要返回key
场景: 最近在写接口时候,正常使用@RestController返回json串,发现当返回的对象里的属性值为空字符串或者null时候,json返回里就会自动去除这个key,啥意思呢?举个"栗子":
/*** 商品评论、回复、点赞【查询】接口** @param goodsId* @param userId* @param currenPage* @param pageSize* @return* @author simons.fan*/@GetMapping("/get-comments-replys")public Response getCommentsAndReplys(@RequestParam(value = "goodsid", required = false) Long goodsId,@RequestParam(value = "userid", required = false) Long userId,@RequestParam(value = "currenpage", defaultValue = "1", required = false) Integer currenPage,@RequestParam(value = "pagesize", defaultValue = "20", required = false) Integer pageSize) {log.info("商品评论查询接口入参:[goodsid={},userid={},currentpage={},pagesize={}]", goodsId, userId, currenPage, pageSize);if (goodsId == null || userId == null)return new Response(BaseCodeEnum.PARAMETER_MISS, null);try {PageBean<CommentsResultVo> commentPageBean = goodsService.getCommentsAndReplys(ImmutableMap.of("userId", userId,"goodsId", goodsId,"currentPage", currenPage,"pageSize", pageSize));return new Response(BaseCodeEnum.SUCCESS, commentPageBean);} catch (Exception e) {log.error("商品评论查询接口异常:[userid={},goodsid={},ex={}]", userId, goodsId, e);}return new Response(BaseCodeEnum.ERROR, null);}
CommentsResultVo部分属性为:
@Data
public class Comment {private Long id;private Long goodsId;private Long userId;private String commentMsg;private Long likeCount;/*** 用户名*/private String userName;/*** 用户头像url*/private String avatarUrl;/*** 用户昵称*/private String userNickName;
}
这么一个方法,预期返回的json应该是:即当avatarUrl为空时候,avatarUrl这个key也必须存在(因为接口的响应报文里面字段非常多,我这里去除了很多字段,主要是一种规范,也是为了前端方便调用)
可实际情况是,当CommentResultVo类里面的某些属性为空或null时候,比如 avatarUrl属性值为空,json串就直接去掉了这个avatarUrl这个key,不够友好。众所周知,springmvc里默认是使用jackson来处理返回的json对象的,一顿源码找,发现不会过滤掉才对的,纳闷,忽然间看到了项目里存在如下代码:
@Configuration
public class WebConfiguration {/*** 使用fastjson解析对象返回数据** @return*/@Beanpublic HttpMessageConverters fastJsonHttpMessageConverters() {FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);List<MediaType> fastMediaTypes = new ArrayList<>();fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);fastConverter.setSupportedMediaTypes(fastMediaTypes);fastConverter.setFastJsonConfig(fastJsonConfig);HttpMessageConverter<?> converter = fastConverter;return new HttpMessageConverters(converter);}
}
问题就在这里,有个同事显式的设置了fastjson来替代默认的jackson处理json返回,这下就好办了,加上新增的序列化方式SerializerFeature.WriteNullStringAsEmpty 即可顺利解决我的问题:
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.PrettyFormat);
上述是在springboot中操作的,xml方式如下:
![](/assets/blank.gif)
这种需求是很常见的,value值为空,key也得返回,这样前端可以很友好的处理你的json。
延伸出来的问题有:
1、当返回的集合类型为空也要包含[ ],例如 "commentList":[ ],而不是 "commentList":null 或"commentList":" ";
2、属性为空,自动给属性对应值赋值为默认的缺省值,比如userId是Long类型,如果为空就自动赋值为0,userName是String,为空则自动赋值为"",而不是null;
当然,有些接口比较特殊,它就是需要和上面相反的做法:当key为空或null,这个字段就不需要返回,这个话,可以借助JackSon的@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)注解,加在实体类上即可。
今天暂时就先写这么多吧,忙工作,后面抽时间续写……未完待续……
引申阅读
Json和Bean间的序列化和反序列化(JSONObject、Gson、FastJson的使用):https://love1024.blog.csdn.net/article/details/78246870
SpringMvc中返回json时对象属性为空也要返回key相关推荐
- json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date
第一 - phpStudy...
Java Web程序中利用Spring框架返回JSON格式的日期 返回Json时格式化日期Date第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@Respo ...
- java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...
java+解析未知json 使用Jackson API在Java中解析JSON时的常见问题之一是,当您的JSON包含未知属性(即您的Java类没有对应于所有JSON属性的所有字段)时,该操作将失败. ...
- SpringMVC 中整合JSON、XML视图一
SpringMVC中整合了JSON.XML的视图,可以通过这些视图完成Java对象到XML.JSON的转换.转换XML提供了MarshallingView,开发者只需用注入相应的marshaller. ...
- java mocked,JMockit 中被 Mocked 的对象属性及方法的默认值
前脚研究完 Mockito 中被 Mocked 的对象属性及方法的默认值, 虽然目今更多的是拥抱着 Mockito, 但总有时对 JMockit 也会挤眉弄眼,谁叫 JMockit 无所不能呢!被 M ...
- 解决thinphp里返回json时斜杆和中文被转义问题
解决thinphp里返回json时斜杆和中文被转义问题 使用该命令来输出 json_encode($download_address,JSON_UNESCAPED_UNICODE|JSON_UNESC ...
- Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决 参考文章: (1)Java中使用json时java.lan ...
- 订单 图片(一对多关系),地址保存在一个字段中(Json数组对象格式)
订单---->图片(一对多关系),地址保存在一个字段中(Json数组对象格式) 1.前端列表动态添加: jsp:<form id="postForm" method=& ...
- BeanUtils.copyProperties() 赋值的对象属性为空 踩过的大坑
最近项目中有个一个类的属性想复制到另一个类的属性里,两个类的属性名称和类型都一致,想到了用 BeanUtils.copyProperties() 这个方法进行拷贝,在使用的过程中出现了一个问题:拷贝完 ...
- html js定义json对象,javascript中的json及对象
③ 使用JSON构造对象 JSON即Javascript对象表示方法(Javascript Object Notation),也就是通过字面量来表示一个对象: //JSON形式创建一个对象 var a ...
最新文章
- 福利 | “石墨烯之父”现场演讲!中国科幻大会“科技与未来”论坛报名中
- python split 倒数第一个_请教一个在python中该如何去掉split之后的第一个单词?
- 如何使用Python玩转PDF各种骚操作?
- 提取字符串中的多个连续数字
- JAVA三角海伦公式,海伦公式求三角形面积出错求教
- 用计算机打出二分之一,win10手机计算器怎么输入二分之一?
- 使用微服务失败的12个原因
- 可以分屏的软件_Screen分屏软件下载|Screen+专业分屏 免费版v1.4.25 下载
- Spring data jpa Specification查询关于日期的范围搜索
- ZooKeeper 到底解决了什么问题?
- 用户自定义控件(UserControl)用法大全
- java android 游戏开发_Java快速开发安卓游戏-aide教程
- 气象报告是什么计算机领域,计算机辅助翻译系统在亚运气象服务方面地应用报告.pdf...
- J-Link软件和文档包的版本发行说明(4)[V6.50 ~ V6.90a版本]
- 刘天佐加盟《经济适用男》 变身木讷IT精英_0
- ubuntu16.04无法调节屏幕亮度
- Windows10 系统安装微软商店(ms-windows-store)
- 个子矮s弯如何看点打方向图解_s弯如何看点打方向盘
- 基于WEB 的实时事件通知
- 《Storytelling With Data》读书心得1
热门文章
- 简单工厂模式——集中式工厂的实现
- 什么用于标记CSS样式的使用优先级,css !important用法以及CSS样式使用优先级判断...
- 【用HTML5来玩读心术】游戏很简单,但是挺有意思,分享给大家
- .html+默认图标,如何将Htm和Html文件图标改回默认
- 【MVP】Liuxiang Chen
- 《现代操作系统:原理与实现》教材简评
- 树莓派ubuntu系统下修改config.txt文件 树莓派config.txt文件修改记录
- 【英语面试】自我介绍篇
- linux定时关机shutdown,windows定时关机和linux定时关机的方法(shutdown命令)
- Android Bundle类