SpringBoot解析JSON数据的三种方案
作者:Archie_java
1 JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。JSON是一个序列化的对象或数组。
2 Spring Boot默认的JSON解析
Spring Boot项目中当我们添加了spring-boot-starter-web依赖,就默认提供了Jackson用于解析Json
2.1 使用示例
创建一个实体类
@Component public class User { private long id; private String username; private Date birthday; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
创建一个Controller类,用于页面访问:
@RestController public class ShowController { @GetMapping("/show") public List<User> show(){ List<User> users=new ArrayList<User>(); for (int i = 0; i < 5; i++) { User user=new User(); user.setId(i); user.setUsername("张三"+i); user.setBirthday(new Date()); users.add(user); } return users; } }
启动项目,浏览器访问,可以看到默认返回了JSON格式的数据
可以看到上面的Date类型数据需要我们自定义格式,在实体类中date属性上添加JsonFormat注解可以实现:
@JsonFormat(pattern = "YYYY-MM-dd") private Date birthday;
修改后重启项目,浏览器访问:
但是当很多类都需要配置自定义格式时,就需要添加多个注解,这样是麻烦且不利于后期维护的。所以我们需要修改全局JSON格式。
下面以修改Date类型数据为例:
2.2 修改特定数据的全局JSON格式
JSON的解析离不开HttpMessageConvert,HttpMessageConvert是一个消息转换工具,主要有两方面的功能:
- 将服务端返回的对象序列化成JSON字符串
- 将前端传来的JSON字符串反序列化成Java对象
SpringMVC中默认配置了Jackson和GsonHttpMessageConverter,Spring Boot中对此做了自动化配置,主要由以下两个类实现:
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration
JacksonHttpMessageConvertersConfiguration的源码如下:
@Configuration( proxyBeanMethods = false ) class JacksonHttpMessageConvertersConfiguration { JacksonHttpMessageConvertersConfiguration() { } @Configuration( proxyBeanMethods = false ) @ConditionalOnClass({XmlMapper.class}) @ConditionalOnBean({Jackson2ObjectMapperBuilder.class}) protected static class MappingJackson2XmlHttpMessageConverterConfiguration { protected MappingJackson2XmlHttpMessageConverterConfiguration() { } @Bean @ConditionalOnMissingBean public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(Jackson2ObjectMapperBuilder builder) { return new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()); } } //配置类注解 @Configuration( proxyBeanMethods = false ) /* *下面几个是条件注解,当添加了Jackson依赖,就有了ObjectMapper.class和属性,后面的配置就会生效 */ @ConditionalOnClass({ObjectMapper.class}) @ConditionalOnBean({ObjectMapper.class}) @ConditionalOnProperty( name = {"spring.http.converters.preferred-json-mapper"}, havingValue = "jackson", matchIfMissing = true ) static class MappingJackson2HttpMessageConverterConfiguration { MappingJackson2HttpMessageConverterConfiguration() { } /* *@ConditionalOnMissingBean的意思就是如果我们没有配置这个Bean,就自动创建一个默认的,当我们配置了就使用我们配置的Bean,不再创建 */ @Bean @ConditionalOnMissingBean( value = {MappingJackson2HttpMessageConverter.class}, ignoredType = {"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter", "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter"} ) /* *MappingJackson2HttpMessageConverter就是Jackson的消息转换工具类 */ MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) { /* *JSON中序列化对象主要用ObjectMapper工具类 */ return new MappingJackson2HttpMessageConverter(objectMapper); } } }
通过查看上面源码,可以知道我们修改生成的JSON的全局格式有以下两种方式:
2.2.1 自定义MappingJackson2HttpMessageConverter
自己创建一个MappingJackson2HttpMessageConverter,取代JacksonHttpMessageConvertersConfiguration中项目自带的。
例:
在上面创建的项目中,首先删除JsonFormat注解,下面新建一个配置类,内容如下:
@Configuration public class WebMVCConfig { @Bean MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){ MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter(); ObjectMapper om=new ObjectMapper(); om.setDateFormat(new SimpleDateFormat("YYYY/MM/dd")); converter.setObjectMapper(om); return converter; } }
2.2.2 自定义ObjectMapper
通过上面的类可以看到类中主要起作用的是ObjectMapping,上面的JacksonHttpMessageConvertersConfiguration可以看ObjectMapping是直接注入的。它是在配置类JacksonAutoConfiguration 中提供的。
修改WebMVCConfig类,内容如下:
@Configuration public class WebMVCConfig { @Bean ObjectMapper objectMapper(){ ObjectMapper om=new ObjectMapper(); om.setDateFormat(new SimpleDateFormat("YYYY/MM/DD")); return om; } }
两种方式都是可以的,浏览器访问:
3 使用Gson处理JSON
3.1 使用示例
基于上面创建的项目进行修改,首先去掉spring-boot-starter-json依赖。然后添加gson依赖:
然后将配置类的jackson部分和一些导入的jackson包注释或删除,然后启动项目。
可以看到日期格式是Gson默认的。需要进行修改
3.2 修改特定数据的全局JSON格式
GsonHttpMessageConvertersConfiguration的部分源码如下:
@Configuration( proxyBeanMethods = false ) @ConditionalOnBean({Gson.class}) @Conditional({GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.class}) static class GsonHttpMessageConverterConfiguration { GsonHttpMessageConverterConfiguration() { } @Bean @ConditionalOnMissingBean GsonHttpMessageConverter gsonHttpMessageConverter(Gson gson) { GsonHttpMessageConverter converter = new GsonHttpMessageConverter(); converter.setGson(gson); return converter; }
可以看到与Jackson差不多,所以可以仿照Jackson进行修改
3.2.1 自定义GsonHttpMessageConverter
@Configuration public class WebMVCConfig { @Bean GsonHttpMessageConverter gsonHttpMessageConverter(){ GsonHttpMessageConverter converter=new GsonHttpMessageConverter(); converter.setGson(new GsonBuilder().setDateFormat("YYYY-MM-DD").create()); return converter; } }
3.2.2 自定义Gson对象
上面配置主要用的是Gson对象,Gson对象是在GsonAutoConfiguration类中,当我们没有配置时为我们创建的。然后在GsonHttpMessageConverter中使用。我们也可以自己创建一个Gson对象:
@Configuration public class WebMVCConfig { @Bean Gson gson(){ return new GsonBuilder().setDateFormat("YYYY-MM-DD").create(); } }
两种方式都是可以的,浏览器访问:
4 使用FastJson处理JSON
4.1 使用示例
以上面创建的项目为基础,去除Jackson依赖,添加FastJson依赖:
因为Spring Boot没有提供相关的自动化配置类,所以我们需要手动创建FastJson的消息转换工具类:
@Configuration public class WebMVCConfig { @Bean FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){ FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter(); return converter; } }
启动项目,浏览器访问:
可以看到日期格式变成了FastJson的格式了。需要进行修改。
4.2 修改特定数据的全局JSON格式
FastJson是直接在 FastJsonHttpMessageConverter类中进行修改,新建一个FastJsonConfig对象,此时需要对编码进行设置,否则会出现乱码:
@Configuration public class WebMVCConfig { @Bean FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){ FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter(); FastJsonConfig config=new FastJsonConfig(); // 处理中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); converter.setSupportedMediaTypes(fastMediaTypes); //设置日期格式 config.setDateFormat("YYYY-MM-DD"); converter.setFastJsonConfig(config); return converter; } }
以上就是SpringBoot解析JSON数据的三种方案的详细内容,更多关于SpringBoot解析JSON数据的资料请关注脚本之家其它相关文章!