SpringBoot中Json解析方案与自定义配置方法(二)——使用Gson

一、添加依赖

 新建一个最简单的Spring项目,导入Web依赖,可以发现依赖里面包含了json依赖,此依赖默认使用的是jackson,如果使用Gson需要在pom.xml中去掉Jackson依赖,并加入Gson依赖。

		<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>

<!--		加入Gson依赖-->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
		</dependency>

二、查看源码

GsonHttpMessageConvertersConfiguration.java

org/springframework/boot/autoconfigure/http/GsonHttpMessageConvertersConfiguration.java

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Gson.class)
class GsonHttpMessageConvertersConfiguration {

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnBean(Gson.class)
	@Conditional(PreferGsonOrJacksonAndJsonbUnavailableCondition.class)
	static class GsonHttpMessageConverterConfiguration {

		@Bean
		@ConditionalOnMissingBean
		GsonHttpMessageConverter gsonHttpMessageConverter(Gson gson) {
			GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
			converter.setGson(gson);
			return converter;
		}

	}

@ConditionalOnClass(ObjectMapper.class):如果用户导入Gson依赖,系统才会默认使用以上配置,使用MappingJackson2HttpMessageConverter转换工具类,才会生效。
@ConditionalOnMissingBean:如果没有配置Bean,系统会默认使用这里的Bean,如果用户对时间格式等另外有需求,需要自主配置,系统则会优先使用用户配置的Bean而忽略系统配置的Bean

GsonAutoConfiguration.java

org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.java

	@Bean
	@ConditionalOnMissingBean
	public Gson gson(GsonBuilder gsonBuilder) {
		return gsonBuilder.create();
	}

三、自定义配置

系统默认配置调试

写一个简单的Controller类,进行简单的测试

@RestController
@RequestMapping("/test")
public class StudentController {
    @GetMapping("/hello")
    public Student get(){
        Student student = new Student();
        student.setId((long) 1);
        student.setAge(15);
        student.setName("alvin");
        student.setBirthday(new Date());
        return student;
    }
}
  • Debug调试:
    在这里插入图片描述
    在这里插入图片描述
    @ConditionalOnClass(Gson.class)中的Gson.class是从GsonAutoConfiguration.java中注入进来的,因此小程序先执行GsonAutoConfiguration.java,然后执行GsonHttpMessageConvertersConfiguration.java.
  • postman调用
     Gson日期的默认返回格式为"Feb 22, 2020 1:55:24 PM",如果用户对日期格式或者其他属性的格式另有需求,可以自定义配置。
    在这里插入图片描述

自定义配置方法与调试:

方案一:

 新建一个JsonConfig.java作为配置类

@Configuration
public class JsonConfig {
    @Bean
    public GsonHttpMessageConverter gsonHttpMessageConverter(){
        GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
        converter.setGson(new GsonBuilder().setDateFormat("yyyy-MM-dd").create());
        return converter;
    }
}
  • Debug调试
    在这里插入图片描述
    在这里插入图片描述
  • postman返回
    在这里插入图片描述

方案二:

 通过方案一,debug发现,系统仅仅是对注入进来的Gson进行了操作,因此可以直接创建一个Gson对象,在GsonAutoConfiguration.java中有一个注解是@ConditionalOnMissingBean,如果用户创建一个新的Gson,GsonAutoConfiguration.java中的Bean将会失效。

    @Bean
    Gson gson(){
        return new GsonBuilder().setDateFormat("yyyy/MM/dd").create();
    }
  • Debug
    在这里插入图片描述
    在这里插入图片描述
     通过可以看到,用户自主创建的Bean主动注入进了GsonHttpMessageConvertersConfiguration.java里面,而GsonAutoConfiguration.java中的Bean失效了。
  • postman返回
    -
发布了71 篇原创文章 · 获赞 102 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_44717317/article/details/104442680