这是我参与8月更文挑战的第3天,活动详情查看: 8月更文挑战
前言
在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理
SpringBoot默认的json解析方案
我们知道在springboot中有默认的json解析器,Spring Boot 中默认使用的 Json 解析技术框架是 jackson
。我们点开 pom.xml 中的 spring-boot-starter-web
依赖,可以看到一个 spring-boot-starter-json
依赖:
1 | xml复制代码 <dependency> |
Spring Boot 中对依赖都做了很好的封装,可以看到很多 spring-boot-starter-xxx 系列的依赖,这是 Spring Boot 的特点之一,不需要人为去引入很多相关的依赖了,starter-xxx 系列直接都包含了所必要的依赖,所以我们再次点进去上面这个 spring-boot-starter-json
依赖,可以看到:
1 | xml复制代码 <dependency> |
我们在controller中返回json时候通过注解@ResponseBody
就可以自动帮我们将服务端返回的对象序列化成json字符串,在传递json body参数时候 通过在对象参数上@RequestBody
注解就可以自动帮我们将前端传过来的json字符串反序列化成java对象
这些功能都是通过HttpMessageConverter
这个消息转换工具类来实现的
SpringMVC自动配置了Jackson
和Gson
的HttpMessageConverter,SpringBoot对此做了自动化配置
JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
1 | java复制代码 @Configuration(proxyBeanMethods = false) |
JacksonAutoConfiguration
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
1 | java复制代码@Configuration(proxyBeanMethods = false) |
Gson的自动化配置类
org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration
1 | java复制代码 @Configuration(proxyBeanMethods = false) |
自定义SprinBoot的JSON解析
日期格式解析
默认返回的是时间戳类型格式,但是时间戳会少一天需要在数据库连接url上加上时区如:
1 | ini复制代码spring.datasource.url=jdbc:p6spy:mysql://47.100.78.146:3306/mall?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&autoReconnect=true |
- 使用
@JsonFormat
注解自定义格式
1 | java复制代码 @JsonFormat(pattern = "yyyy-MM-dd") |
但是这种要对每个实体类中的日期字段都需要添加此注解不够灵活
- 全局添加
在配置文件中直接添加spring.jackson.date-format=yyyy-MM-dd
NULL字段不返回
- 在接口中如果不需要返回null字段可以使用
@JsonInclude
注解
1 | java复制代码 @JsonInclude(JsonInclude.Include.NON_NULL) |
但是这种要对每个实体类中的字段都需要添加此注解不够灵活
- 全局添加 在配置文件中直接添加
spring.jackson.default-property-inclusion=non_null
自定义字段序列化
自定义null字符串
类型字段返回空字符NullStringJsonSerializer
序列化
1 | java复制代码public class NullStringJsonSerializer extends JsonSerializer { |
自定义null数字
类型字段返回0默认值NullIntegerJsonSerializer
序列化
1 | java复制代码public class NullIntegerJsonSerializer extends JsonSerializer { |
自定义浮点小数
类型4舍5入保留2位小数DoubleJsonSerialize
序列化
1 | java复制代码public class DoubleJsonSerialize extends JsonSerializer { |
自定义NullArrayJsonSerializer
序列化
1 | java复制代码public class NullArrayJsonSerializer extends JsonSerializer { |
自定义BeanSerializerModifier
使用我们自己的序列化器进行bean序列化
1 | java复制代码public class MyBeanSerializerModifier extends BeanSerializerModifier { |
应用我们自己bean序列化使其生效 提供MappingJackson2HttpMessageConverter类
在配置类中提供MappingJackson2HttpMessageConverter类,使用ObjectMapper 做全局的序列化
1 | java复制代码@Configuration |
此类会代替SpringBoot默认的json解析方案。事实上,此类中起作用的是ObjectMapper
类,因此也可直接配置此类。
1 | java复制代码 @Bean |
通过上面方式自定义序列化,还可以通过注解 @JsonSerialize
序列化自定义如:
1 | java复制代码@Component |
然后再需要使用字段上面加上
1 | java复制代码 @JsonSerialize(using = DoubleJsonSerialize.class) |
配置文件jackson详细配置
1 | yml复制代码 spring: |
本文转载自: 掘金