项目开发中,接口与接口之间、前后端之间的数据传输都使用 JSON 格式。本文就来讲解 Spring Boot 是如何返回 JSON 格式数据的。
@RestController 注解
Spring Boot 中,接口返回 JSON 格式的数据很简单,在 Controller 中使用 @RestController 注解即可返回 JSON 格式的数据。
@RestController 也是 Spring Boot 新增的一个注解,我们点进去看一下该注解都包含了哪些东西。
@RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解。使用过 Spring 的朋友对 @Controller 注解已经非常了解了,这里不再赘述。@ResponseBody 注解是将返回的数据结构转换为 JSON 格式。
所以在默认情况下,使用了 @RestController 注解即可将返回的数据结构转换成 JSON 格式,在 Spring Boot 中默认使用的 JSON 解析技术框架是 Jackson。
我们点开 pom.xml 中的 spring-boot-starter-web 依赖,可以看到 spring-boot-starter-json 依赖:
Spring Boot 对依赖都做了很好的封装,可以看到很多 spring-boot-starter-xxx 系列的依赖,这是 Spring Boot 的特点之一,不需要人为引入很多相关的依赖,starter-xxx 系列直接包含了所必要的依赖,所以我们再次点进去上面提到的 spring-boot-starter-json 依赖,可以看到如下代码:
到此为止,我们知道了 Spring Boot 中默认使用的 JSON 解析框架是 Jackson。下面我们看一下默认的 Jackson 框架对常用数据类型的转 JSON 处理。
常用数据类型转为 JSON 格式
在实际项目中,常用的数据结构无非有类对象、List 对象、Map 对象,我们看一下默认的 Jackson 框架如何将这三个常用的数据结构转成 JSON 格式的。
为了测试,我们需要创建一个实体类,这里我们就用 User 来演示。
然后我们创建一个 Controller,分别返回 User 对象、List
OK,写好了接口,分别返回了一个 User 对象、一个 List 集合和一个 Map 集合,其中 Map 集合中的 value 存的是不同的数据类型。接下来我们依次测试下效果了(大家可以自己测试一下)。
在实际项目中,我们难免会遇到一些 null 值。当我们转 JSON 时,不希望这些 null 出现,比如我们期望所有的 null 在转 JSON 时都变成“""”这种空字符串,那怎么做呢?在 Spring Boot 中,我们做一下配置即可,新建一个 Jackson 的配置类:
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString("");
}
});
return objectMapper;
}
}
这样的话,null就会被转成对应的空字符串。
使用fastJson
有很多朋友习惯于使用阿里巴巴的 fastjson 来做项目中 JSON 转换的相关工作,目前我们项目中使用的就是阿里的 fastjson,那么 Jackson 和 fastjson 有哪些区别呢?根据网上公开的资料比较可得到下表。
关于 Jackson 和 fastjson 的对比,网上有很多资料可以查看,大家可以根据自己实际项目情况选择合适的框架。从扩展上来看,fastjson 没有 Jackson 灵活,从速度或者上手难度来看,fastjson 可以考虑,它也比较方便。
使用 fastjson 需要导入依赖,本文使用 1.2.35 版本,依赖如下:
使用 fastjson 时,对 null 的处理和 Jackson 有些不同,需要继承 WebMvcConfigurationSupport 类,然后覆盖 configureMessageConverters 方法。在方法中,我们可以选择要实现 null 转换的场景,配置好即可。代码如下:
封装统一返回的数据结构
以上展示了 Spring Boot 返回 JSON 的代表案例,但在实际项目中,除了要封装数据之外,我们往往需要在返回的 JSON 中添加一些其他信息,比如返回状态码 Code,返回 Msg 给调用者,调用者可以根据 Code 或者 Msg 进行一些逻辑判断。所以在实际项目中,我们需要封装一个统一的 JSON 返回结构存储返回信息。
由于封装的 JSON 数据的类型不确定,所以在定义统一的 JSON 结构时,我们需要用到泛型。
统一的 JSON 结构中属性包括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加。一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。代码如下:
因为 JsonResult 使用了泛型,所以所有的返回值类型都可以使用该统一结构。在具体的场景将泛型替换成具体的数据类型,非常方便,也便于维护。在实际项目中,还可以继续封装,比如状态码和提示信息可以定义一个枚举类型,以后我们只需要维护这个枚举类型中的数据即可。
总结
本文主要对 Spring Boot 中 JSON 数据的返回做了详细分析,并对 Spring Boot 默认的 Jackson 框架和阿里巴巴的 fastjson 框架的配置过程过程进行了相应讲解。
另外,结合实际项目情况,还总结了实际项目中使用的 JSON 封装结构体,加入了状态码和提示信息,使得返回的 JSON 数据信息更加完整。