目录
- 1、Gson 依赖
- 2、Gson自动配置
- 3、配置Gson为首选JSON映射器
- 4、完全排除Jackson
- 5、实战
- 6、测试
- 7、小结
TL;DR
本文,我们一起来实践使用Gson作为首选的json映射器,替换Spring Boot默认的Jackson。
1. Gson依赖
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>
2. Gson自动配置
Spring Boot 自动支持Gson,会在启动时去搜索是否有gson的类,并通过自动配置来创建一个Gson的默认值的bean。
2.1. Gson Bean
Spring Boot 如果检测到存在Gson.class类存在,便会使用GsonAutoConfiguration来配置Gson Bean实例。
我们可以直接使用自动装配的spring bean,如下:
@Resource
private Gson gson;
2.2. 自定义 Gson Bean
为了自定义Gson实例的默认行为,我们可以从下面的列表中配置相应的属性。
# 序列化日期对象时使用的格式
spring.gson.date-format=
# 是否禁用HTML的转义字符(比如'<','>'等)
spring.gson.disable-html-escaping=
# 序列化时是否排除内部类
spring.gson.disable-inner-class-serialization=
# 序列化时是否启用复杂映射键
spring.gson.enable-complex-map-key-serialization=
# 序列化或反序列化时是否排除所有没有“@Expose”注解的字段。
spring.gson.exclude-fields-without-expose-annotation=
# 序列化时应用于对象字段的命名策略
spring.gson.field-naming-policy=
# 是否在输出之前添加一些特殊文本来生成不可执行的JSON
spring.gson.generate-non-executable-json=
# 是否放宽解析不符合RFC 4627的JSON
spring.gson.lenient=
# Long类型的序列化策略
spring.gson.long-serialization-policy=
# 序列化时是否输出经过美化后格式的JSON
spring.gson.pretty-printing=
# 是否序列化空字段(null)
spring.gson.serialize-nulls=
3. 配置Gson为首选JSON映射器
在 application.properties
文件中使用此如下配置属性:
spring.http.converters.preferred-json-mapper=gson
4. 完全排除Jackson
我们都知道Spring Boot 2 默认的JSON映射器是Jackson。如果想从应用中完全排除Jackson,可以通过排除 spring-boot-starter-json
依赖来实现。
4.1. 从项目依赖项中排除Jackson
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除默认 Jackson 依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
4.2. 禁用自动配置
如果只想在Spring Boot配置中排除Jackson,可以通过禁用自动配置类JacksonAutoConfiguration
来排除它。
@SpringBootApplication(exclude = {JacksonAutoConfiguration.class})
public class AppStartJson {
... ...
}
5. 实战
- github代码地址:
5.1. 创建Spring Boot启动类
通过 start.spring.io/ 创建项目,添加启动类 AppStartJson
类。
package com.mickjoust.demo.springboot2_in_action.json;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
/**
* @author mickjoust
**/
@SpringBootApplication(exclude = {JacksonAutoConfiguration.class})
public class AppStartJson {
public static void main(String[] args) {
SpringApplication.run(AppStartJson.class,args);
}
}
5.2. 创建Restful API
我们模拟一个简单的Json 序列化和反序列化的例子。
package com.mickjoust.demo.springboot2_in_action.json.gson;
import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author mickjoust
**/
@RestController
public class TestGsonController {
@PostMapping(value = "/gson")
public String gson(@RequestBody TestGson testGson){
Gson gson = new Gson();
List<String> stringList = new ArrayList<>();
stringList.add("Mick");
stringList.add("Spike");
stringList.add("Mia");
stringList.add("Max");
testGson.setFriends(stringList);
Map<String,Object> map = new HashMap<>();
map.put("test1",123);
map.put("test2","123");
map.put("test3",123L);
testGson.setData(map);
System.out.println(gson.toJson(testGson));
return gson.toJson(testGson);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
static class TestGson {
private String name;
private Integer age;
private List<String> friends;
private Map<String,Object> data;
}
}
6. 测试
使用postman来模拟测试序列化和反序列化场景,:
- 输入一个简单的json作为对象,再将对象增加值后并响应返回json。
7. 小结
到此,在Spring Boot 2中使用Gson便完成。
转载:https://blog.csdn.net/mickjoust/article/details/106331413
查看评论