04.SpringBoot 之 JSON解析

SpringBoot 之 JSON解析

Jackson数据转换

@RestController 注解相当于 @Controller + @ResponseBody.

我们都知道,使用了上面的注解,我们就可以返回JSON格式的数据,那么是为什么呢?

HttpMessageConverter, 这是一个消息转换工具,有两方面的功能:

  1. 将服务端返回的对象序列化成JSON字符串。
  2. 将前端传来的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
<!--导入spring web mvc 依赖-->
<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
<!--导入spring web mvc 依赖-->
<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>

<!--GSON-->
<!--
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</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
 <!--引入FastJSON-->
<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;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×