场景: 最近在写接口时候,正常使用@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方式如下:

注:图片取自网络

这种需求是很常见的,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相关推荐

  1. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...

    Java Web程序中利用Spring框架返回JSON格式的日期 返回Json时格式化日期Date第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@Respo ...

  2. java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...

    java+解析未知json 使用Jackson API在Java中解析JSON时的常见问题之一是,当您的JSON包含未知属性(即您的Java类没有对应于所有JSON属性的所有字段)时,该操作将失败. ...

  3. SpringMVC 中整合JSON、XML视图一

    SpringMVC中整合了JSON.XML的视图,可以通过这些视图完成Java对象到XML.JSON的转换.转换XML提供了MarshallingView,开发者只需用注入相应的marshaller. ...

  4. java mocked,JMockit 中被 Mocked 的对象属性及方法的默认值

    前脚研究完 Mockito 中被 Mocked 的对象属性及方法的默认值, 虽然目今更多的是拥抱着 Mockito, 但总有时对 JMockit 也会挤眉弄眼,谁叫 JMockit 无所不能呢!被 M ...

  5. 解决thinphp里返回json时斜杆和中文被转义问题

    解决thinphp里返回json时斜杆和中文被转义问题 使用该命令来输出 json_encode($download_address,JSON_UNESCAPED_UNICODE|JSON_UNESC ...

  6. Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决

    Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决 参考文章: (1)Java中使用json时java.lan ...

  7. 订单 图片(一对多关系),地址保存在一个字段中(Json数组对象格式)

    订单---->图片(一对多关系),地址保存在一个字段中(Json数组对象格式) 1.前端列表动态添加: jsp:<form id="postForm" method=& ...

  8. BeanUtils.copyProperties() 赋值的对象属性为空 踩过的大坑

    最近项目中有个一个类的属性想复制到另一个类的属性里,两个类的属性名称和类型都一致,想到了用 BeanUtils.copyProperties() 这个方法进行拷贝,在使用的过程中出现了一个问题:拷贝完 ...

  9. html js定义json对象,javascript中的json及对象

    ③ 使用JSON构造对象 JSON即Javascript对象表示方法(Javascript Object Notation),也就是通过字面量来表示一个对象: //JSON形式创建一个对象 var a ...

最新文章

  1. 福利 | “石墨烯之父”现场演讲!中国科幻大会“科技与未来”论坛报名中
  2. python split 倒数第一个_请教一个在python中该如何去掉split之后的第一个单词?
  3. 如何使用Python玩转PDF各种骚操作?
  4. 提取字符串中的多个连续数字
  5. JAVA三角海伦公式,海伦公式求三角形面积出错求教
  6. 用计算机打出二分之一,win10手机计算器怎么输入二分之一?
  7. 使用微服务失败的12个原因
  8. 可以分屏的软件_Screen分屏软件下载|Screen+专业分屏 免费版v1.4.25 下载
  9. Spring data jpa Specification查询关于日期的范围搜索
  10. ZooKeeper 到底解决了什么问题?
  11. 用户自定义控件(UserControl)用法大全
  12. java android 游戏开发_Java快速开发安卓游戏-aide教程
  13. 气象报告是什么计算机领域,计算机辅助翻译系统在亚运气象服务方面地应用报告.pdf...
  14. J-Link软件和文档包的版本发行说明(4)[V6.50 ~ V6.90a版本]
  15. 刘天佐加盟《经济适用男》 变身木讷IT精英_0
  16. ubuntu16.04无法调节屏幕亮度
  17. Windows10 系统安装微软商店(ms-windows-store)
  18. 个子矮s弯如何看点打方向图解_s弯如何看点打方向盘
  19. 基于WEB 的实时事件通知
  20. 《Storytelling With Data》读书心得1

热门文章

  1. 简单工厂模式——集中式工厂的实现
  2. 什么用于标记CSS样式的使用优先级,css !important用法以及CSS样式使用优先级判断...
  3. 【用HTML5来玩读心术】游戏很简单,但是挺有意思,分享给大家
  4. .html+默认图标,如何将Htm和Html文件图标改回默认
  5. 【MVP】Liuxiang Chen
  6. 《现代操作系统:原理与实现》教材简评
  7. 树莓派ubuntu系统下修改config.txt文件 树莓派config.txt文件修改记录
  8. 【英语面试】自我介绍篇
  9. linux定时关机shutdown,windows定时关机和linux定时关机的方法(shutdown命令)
  10. Android Bundle类