返回JSON数据
默认实现
Json是目前主流的前后端数据传输方式,SptringMVC中使用消息转换器HttpMessageConverter对JSON的转换提供了很好的支持,在SpringBoot中更进一步,对相关的配置做了简化。默认情况下,当开发者新创建一个SpringBoot项目后,添加web依赖,这个依赖默认加入了jackson-databind作为JSON处理器,此时不需要添加额外的JSON处理器就能返回一段JSON了。
HttpMessageConverter,看名字就知道,这是一个消息装换工具,有两个方面的功能:
- 将服务端返回的对象序列化成JSON字符串
- 将前端传来的JSON字符串反序列化成Jason对象
所有的JSON对象都离不开相关的HttpMessageConverter
SpringMVC自动配置了Jackson和Gson的HttpMessageConverter,SpringBoot中又对此做了自动化配置
- org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
- org.springframework.http.converter.json.GsonHttpMessageConverter
所以用户使用Jackson和Gson的话,没有其他额外配置,则只需要添加依赖即可
使用Jackson
bean
public class User {
private Integer id;
private String username;
private String address;
private Date birthday;
...
}
controller
@RestController
public class UserController {
@GetMapping("users")
public List<User> getAllUser(){
List<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId(i);
user.setUsername("java技术"+i);
user.setAddress("www.qwl.com"+i);
user.setBirthday(new Date());
users.add(user);
}
return users;
}
}
运行结果
自定义转换器
可以看出我们重写MappingJackson2XmlHttpMessageConverter
@Configuration
public class WebMvcConfig {
@Bean
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
MappingJackson2HttpMessageConverter converter =
new MappingJackson2HttpMessageConverter();
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
converter.setObjectMapper(om);
return converter;
}
}
运行
从上面可以知道起关键作用的是ObjectMapper
@Bean
ObjectMapper objectMapper(){
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
return om;
}
运行一样起作用
使用Gson
排除jackson,添加Gson
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
@Configuration
public class WebMvcConfig {
@Bean
GsonHttpMessageConverter gsonHttpMessageConverter(){
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(new GsonBuilder().setDateFormat("yyyy/MM/dd").create());
return converter;
}
}
或者
@Bean
Gson gson() {
return new GsonBuilder().setDateFormat("yyyy/MM/dd").create();
}
使用fastjson
fastjson 是阿里巴巴的一个开源JSON 解析框架, 是目前JSON 解析速度最快的开源框架,该框架也可以集成到Spring Boot 中。不同于Gson, fastjson 继承完成之后并不能立马使用, 需要开
发者提供相应的HttpMessageConverter 后才能使用,集成fastjson 的步骤如下。
首先除去j ackson-databind 依赖,引入fastjson 依赖:
然后配置fastjson的HttpMessageConverter:
代码解释:
- 自定义MyFastJsonConfig,完成对FastJsonHttpMessageConverter Bean的提供。
- 第7~ 15 行分别配直了JSON 解析过程的一些细节,例如日期格式、数据编码、是否在生成的JSON 中输出类名、是否输出value 为null 的数据、生成的JSON 格式化、空集合输出口而非null 、空字符串输出“”而非null 等基本配置。
MyFastJsonConfig 配置完成后,还需要配置一下响应编码,否则返回的JSON 中文会乱码,在application.properties中添加如下配置:
spring.http.encoding.force-response=true
接下来提供BookController 进行测试。