SpringBoot2使用Gson替代jackson并适配Swagger

SpringBoot2使用Gson替代jackson并适配Swagger

涉及到的软件版本

  • SpringBoot:2.2.5.RELEASE
  • gson:2.8.6
  • springfox-swagger2:2.9.2

为什么使用Gson

Gson与fastJson、jackson相比,对泛型的支持比fastJson、jackson都要好。对于并不特别复杂的小型简单数据结构的转换处理,性能上有明显优势。所以弃用SpringBoot2中内置的jackson,用Gson替代。

如何使用Gson

spring-boot-starter-web中已经引了Gson的依赖,所以pom.xml中无需改动。

思路

1、创建一个GsonHttpMessageConverter,通过setDateFormat("yyyy-MM-dd")指定日期格式,通过registerTypeAdapter(Json.class, new GsonConfig())指定特殊类型的转换规则(用于解决springfox不支持Gson的问题)。
2、再将GsonHttpMessageConverter放入HttpMessageConverters中。
3、在SpringApplication启动类中禁止JacksonAutoConfiguration

完整代码示例

Gson配置类
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import springfox.documentation.spring.web.json.Json;
/**
 * SpringfoxJsonToGsonAdapter
 */
@Configuration
public class GsonConfig implements JsonSerializer<Json> {
    
    @Bean
    public HttpMessageConverters customConverters() {

        Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        gsonHttpMessageConverter.setGson(
        		new GsonBuilder()
        			.setDateFormat("yyyy-MM-dd")
        			.registerTypeAdapter(Json.class, new GsonConfig())
        			.create());
        messageConverters.add(gsonHttpMessageConverter);

        return new HttpMessageConverters(true, messageConverters);
    }

	@SuppressWarnings("deprecation")
	@Override
	public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {
		final JsonParser parser = new JsonParser();
        return parser.parse(json.value());
	}
}
SpringApplication启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;

/**
 * SpringApplication
 */
...
@SpringBootApplication(exclude = { JacksonAutoConfiguration.class })
public class MyBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyBootApplication.class, args);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jason9211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值