1.1 什么是json
- JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
- json是目前主流的前后端数据传送方式,springmvc中使用消息转换器HttpMessageConverter对json的转换器提供了很好的支持。
1.2 jackson
1.2.1 jackson依赖添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
当我们使用springboot开发时,添加的web依赖中默认支持了jackson-databind作为json处理器,如下图
1.2.2 案例实现
- 实体类book
@Data
public class Book {
private String name;
private String author;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
}
- BookContoller
@RestController
public class BookController {
@GetMapping("/book")
public Book book() {
Book book = new Book();
book.setName("三国演义");
book.setAuthor("罗贯中");
book.setBirthday(new Date());
return book;
}
}
- 页面展示
需要注意的是:这里日期通过在Book类中添加注解进行了格式化,这个有一定的缺点,如果我们有很多个类都需要日期格式化,这就比较烦琐了,于是我们有了新的解决方法。
1.2.3 自定义日期格式化
源码解析:
JacksonHttpMessageConvertersConfiguration类中部分源码:
@Bean
@ConditionalOnMissingBean(
value = {MappingJackson2HttpMessageConverter.class},
ignoredType = {"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter", "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter"}
)
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
return new MappingJackson2HttpMessageConverter(objectMapper);
}
根据这段源码可知:如果我们没有给JacksonHttpMessageConvertersConfiguration注入bean,那么他会自动给我们添加一个该类,如果我们想自己实现这个类,需自己另外实现该方法。
@Configuration
public class MyConfig {
@Bean
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
converter.setObjectMapper(om);
return converter;
}
}
但是我们又会发现这个方法中只是两行代码起到作用,那么我们是不是可以只写这两行代码来实现该功能呢?
再看下JacksonAutoConfiguration类中部分源码
@Bean
@Primary
@ConditionalOnMissingBean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
所以可以在写一个方法来给ObjectMapper 注入bean即可
@Bean
ObjectMapper objectMapper() {
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
return om;
}
经过测试,以上两种方法都可以实现功能。
1.3 Gson
- Gson是Google的一个开源JSON解析框架,使用Gson,需要先出去默认的jackson处理器,然后添加依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
同样的开发者可以自己定义相应的日期格式化
@Configuration
public class GsonConfig {
@Bean
GsonHttpMessageConverter gsonHttpMessageConverter() {
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyyy-MM-dd");
Gson gson = builder.create();
converter.setGson(gson);
return converter;
}
@Bean
Gson gson() {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyyy/MM/dd");
Gson gson = builder.create();
return gson;
}
}
这里也可以使用两种方法实现,原理与jackson相似。
1.4 fastjson
- fastjson是阿里巴巴的一个开源json解析框架,是目前解析速度最快的开源框架,不同于Gson,fastjson继承后不能够马上使用,开发者必须提供相应的HttpMessageeConverter后才可以使用。
1.添加依赖(同样需要去除jackson的依赖)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2.自定义提供一个FastJsonHttpMessageConverter
@Configuration
public class MyFastJsonConfig {
@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd");
converter.setFastJsonConfig(config);
return converter;
}
}
3.页面展示
乱码了,没有配置响应编码,这一点要注意!!!
在上述代码中添加一段代码
converter.setDefaultCharset(Charset.forName("utf-8")); //防止乱码
同时在application.properties中配置
spring.http.encoding.force-response=true
最后再次测试
乱码问题解决!