spring-boot-starter-web
中默认加入了jackson-databind
作为JSON处理器。在jackson
中,对要忽略的属性上加@JsonIgnore
即可,而对于时间进行格式化,则需要在需要格式化的属性上面加上@JsonFormat
注解,并指定格式。
@Data
public class Student {
/** ID */
private Long id;
/** 姓名 */
private String name;
/** 性别 */
private String sex;
/** 班级 */
@JsonIgnore // 忽略传送给前端
private String classGrade;
/** 入学日期 */
@JsonFormat(pattern = "yyyy-MM-dd") // 时间格式化
private Date admissionDate;
}
@RestController
public class StudentController {
@GetMapping("/student")
public Student student(){
Student student = new Student();
student.setId(1L);
student.setName("柳成荫");
student.setSex("男");
student.setClassGrade("21班");
student.setAdmissionDate(new Date());
return student;
}
}
gson
是一个JSON的开源解析框架。在SpringBoot中要使用其他的JSON解析框架,因为spring-boot-starter-web
自动引入了jackson-databind
,所以需要先移除它。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
dependency>
在写配置文件前,先对之前的Student
类进行修改,去除所有属性上的注解,并将Sex
属性修改为protected
,这是因为Gson
可以指定被某类修饰符所修饰的属性进行忽略。
SpringBoot使用Gson
可以像jackson
一样,因为提供了自动转换类。但是想要对日期进行格式化,需要自己提供自定义的HttpMessagerConverter
。
@Configuration
public class GsonConfig {
@Bean
public GsonHttpMessageConverter gsonHttpMessageConverter(){
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
GsonBuilder builder = new GsonBuilder();
// 设置解析日期的格式
builder.setDateFormat("yyyy-MM-dd HH:MM:SS");
// 过滤修饰符为protected的属性
builder.excludeFieldsWithModifiers(Modifier.PROTECTED);
Gson gson = builder.create();
converter.setGson(gson);
return converter;
}
}
fastjson
是阿里巴巴的一个开源JSON解析框架,是目前JSON解析速度最快的开源框架。同样,集成fastjson
需要去除默认的jackson
。fastjson
不能像前面两个框架,在SpringBoot中可以直接使用,它需要我们自己提供一个HttpMessageConverter
。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.28version>
dependency>
fastjson可以自己写一个config
,像上面的gson一样,提供FastJsonHttpMessageConverter
的方法即可,也可以通过实现WebConfigurer
接口里的configureMessageConverters
方法来进行配置。
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
// 设置日期格式化
config.setDateFormat("yyyy-MM-dd");
// 设置数据编码
config.setCharset(Charset.forName("UTF-8"));
config.setSerializerFeatures(
// SerializerFeature.WriteClassName, // 在生成JSON中输出类名(一般都不需要)
SerializerFeature.WriteMapNullValue, // 输出value为null的数据
SerializerFeature.PrettyFormat, // JSON格式化
SerializerFeature.WriteNullListAsEmpty, // 集合为空时,输出[]
SerializerFeature.WriteNullStringAsEmpty // String为空时,输出""
);
converter.setFastJsonConfig(config);
// 将自定义的FastJsonHttpMessageConvert加入converters中
converters.add(converter);
}
}
前面说了,可以通过自己写的配置类来完成FastJsonHttpMessageConverter
。
@Configuration
public class MyFastJsonConfig {
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){
// 将上面方法里的内容写到这里即可
}
}
其实Gson
也是可以通过WebMvcConfigurer
接口来做,但是不推荐
。因为,如果项目中没有GsonHttpMessageConverter
,SpringBoot会自己提供一个GsonHttpMessageConverter
。这时,我们去重写configureMessageConverters
方法需要替换已有的GsonHttpMessageConverter
实例,这是很麻烦的。
使用fastjson
,还需要配置响应编码
,如果不配置,可能会导致中文乱码。
spring:
http:
encoding:
force-response: true # 响应编码