项目开发中,接口与接口之间、前后端之间的数据传输都使用 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<User> 和 Map<String, Object>。
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 数据信息更加完整。