SpringBoot 之 JSON解析
Jackson数据转换
@RestController
注解相当于 @Controller
+ @ResponseBody
.
我们都知道,使用了上面的注解,我们就可以返回JSON格式的数据,那么是为什么呢?
HttpMessageConverter, 这是一个消息转换工具,有两方面的功能:
- 将服务端返回的对象序列化成JSON字符串。
- 将前端传来的JSON字符串反序列化成Java对象。
所有的JSON生成都离不开相关的HttpMessageConverter。
SpringMVC自动配置了Jackson和Gson的HttpMessageConverter,SpringBoot中又对此做了自动化配置。所以,如果用户使用jackson和gson的话,没有其他配置,则只需要添加依赖即可。
1 2
| org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
|
实例:当我们正常使用Controller返回时间类型的时候。得到的是这样的:
1 2 3 4 5 6
| { "id": 1, "username": "tom-0", "address": "ooyhao.github.io", "birthday": "2020-02-29T15:54:03.065+0000" }
|
那么我们如果需要格式化时间呢,需要如何做呢,有两种方式。
第一种:在属性上面使用@JsonFormat
注解进行指定,这种可以单独指定某一个属性的格式,可以自由设定。
1 2 3 4 5 6 7 8
| @Data public class User { private Integer id; private String username; private String address; @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; }
|
第二种:全局配置,统一管理:当我们只需要进行格式时间等时,以下两种方式任选其一即可。这样配置,将相当于出去的格式是统一的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); converter.setObjectMapper(mapper); return converter; }
@Bean public ObjectMapper objectMapper(){ ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); return mapper; }
|
当然;如果我们大部分情况下,需要的是全局配置统一格式,但是有时候也不乏需要定制格式呢。但怎么办?可以通过上面两者结合的方式,既指定@JsonFormat
也使用全局配置MapperJackson2HttpMessageConverter
。此时生效的是使用@JsonFormat
。所以,定制化的配置会覆盖全局配置的。
Gson 数据转换
上面使用的是Jackson,下面我们使用一下Gson。
由于SpringBoot默认使用的是Jackson,那么如何进行切换呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <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>
|
Gson的全局配置该如何配置呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Bean public GsonHttpMessageConverter gsonHttpMessageConverter(){ GsonHttpMessageConverter converter = new GsonHttpMessageConverter(); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setDateFormat("yyyy-MM-dd"); converter.setGson(gsonBuilder.create()); return converter; }
@Bean public Gson gson(){ GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("yyyy-MM-dd"); return builder.create(); }
|
如上所述,是利用Gson统一配置时间格式化信息。
FastJson数据转换
Jackson和Gson,在SpringBoot中都做了默认的支持,即有响应的自动配置类,但是FastJson,springBoot并没有做默认的支持,所以需要我们手动来配置 HttpMessageConverter.
在我们没有配置FastJson的HttpMessageConverter的时候,同时也把Jackson和Gson依赖去除时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <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>
|
访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @RestController public class UserController { @GetMapping("/users") public List<User> getAllUser(){ List<User> users = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setId(i + 1); user.setUsername("tom-" + i); user.setAddress("ooyhao.github.io"); user.setBirthday(new Date()); users.add(user); } return users; } }
|
访问上面这段代码会抛出异常,也可以看出,No converter found for return value of type.
但是我们可以发现,使用Jackson或是Gson的时候,我们是可以正常访问的。这就是SpringBoot自动配置的功劳了。下面我们使用FastJson:
首先引入依赖:
1 2 3 4 5 6
| <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
|
配置HttpMessageConverter:
1 2 3 4 5 6 7 8
| @Bean public FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){ FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); converter.setFastJsonConfig(fastJsonConfig); return converter; }
|
我们再次访问就正常了,同时时间也进行了格式化。
同时FastJson也支持单个字段格式化:
1 2 3 4 5 6 7 8
| @Data public class User { private Integer id; private String username; private String address; @JSONField(format = "yyyy-MM-dd") private Date birthday; }
|