SpringBoot jackson(Date类型入参、格式化,以及如何处理null)

首先,我们要知道 springboot 默认使用 jackson 解析 json(当然这里也是可以配置使用其他 json 解析框架)。
在不配置其他 json 解析的情况下,我们可以通过 spring boot 提供的注解和配置 来让 jackson 帮助我们提高开发效率

使用 @ResponseBody @RequestBody, Date 类型对象入参,返回json格式化

解决方法如下:

1. application.properties中加入如下代码
1
2
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
2. 如果个别实体需要使用其他格式的 pattern,在实体上加入注解即可
1
2
3
4
5
6
7
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
public class MrType {
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date createdDate;
}

关于spring boot 时间类型支持我做了以下测试:
1) application.properties 配置注释,不添加注解:spring 无法接收时间参数(400),json 输出 "2018-03-29T09:45:31.513+0000"
2) application.properties 配置开启,不添加注解:仅支持 yyyy-MM-dd HH:mm:ss 的格式参数和 json 输出
3) application.properties 配置开启,实体添加 @JsonFormat(pattern = "yyyy-MM-dd"),实体可接受 yyyy-MM-dd HH:mm:ssyyyy-MM-dd 格式的参数,json输出格式为 yyyy-MM-dd,由此可见@JsonFormat是限制Date 类型 json 输出的,但是为什么对接受的类型也造成了影响?有待考证
4) application.properties 配置开启,实体添加 @DateTimeFormat(pattern = "yyyy-MM-dd"),结果与第二条测试一样?貌似@DateTimeFormat 注解并没有生效?有待考证
5) application.properties 配置开启,实体添加 @JsonFormat@DateTimeFormat 结果与第三条一样

结论:实际项目中 application.properties设置通用时间格式,个别属性需要特殊处理时,添加@JsonFormat
@JsonFormat 自己好像就把这件事搞定了)

使用 @ResponseBody 时 忽略 json 中值为null的属性

1. application.properties中加入如下代码
1
spring.jackson.default-property-inclusion=non-null

或者在类上声明
@JsonInclude(JsonInclude.Include.NON_NULL)

1
2
3
4
5
6
7
import java.io.Serializable;

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)//该注解配合jackson,序列化时忽略 null属性
public class AjaxResult implements Serializable {
}