SpringBoot2使用Gson替代jackson并适配Swagger

SpringBoot2使用Gson替代jackson并适配Swagger

文章目录

  • SpringBoot2使用Gson替代jackson并适配Swagger
      • 涉及到的软件版本
      • 为什么使用Gson
      • 如何使用Gson
          • 思路
      • 完整代码示例
          • Gson配置类
          • SpringApplication启动类

涉及到的软件版本

  • 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);
    }
}

你可能感兴趣的:(SpringBoot,spring,boot,json,gson,java)