阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson;
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson;
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。
下面就演示如何在Spring boot中使用FastJson:
先在pom.xml中导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
配置方法有两种,第一种我比较常用的:
在spring配置类中注入Bean : HttpMessageConverters
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
//1、需要先定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastJson的配置信息,比如:是否格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//A、处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
//4、返回
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
第二种配置方法:
首先需要Spring boot启动类继承WebMvcConfigurerAdapter
然后覆盖父类方法configureMessageConverters
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat
);
//A、处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
到此FastJson就配置完成了。
测试一下效果:
首先建一个实体类
public class User {
private int id;
private String name;
//返回的fastjson指定的格式
@JSONField(format="yyyy-MM-dd HH:mm")
private Date createTime;
private String remark;
//序列化时不包含该字段 json不返回remark
@JSONField(serialize=false)
public String getRemark() {
return remark;
}
//此处省略getter setter
}
然后在Controller中写一个测试方法:
@RequestMapping("getUser")
@ResponseBody
public User getUser(){
User user = new User();
user.setId(1);
user.setName("张三");//如果不添加第A步,会出现中文乱码
user.setCreateTime(new Date());
user.setRemark("这是一个备注");
return user;
}
注意必须要上
@ResponseBody
@ResponseBody注解的作用是将controller的方法返回的对象通过转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据
在使用此注解之后不会再走springmvc的视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据
最后访问一下:http://127.0.0.1:8080/getUser
@JSONField还有其他的用法:
/**bean 转json 时会把bean中的id转换为user_id */
@JSONField(name="user_id")
public int getId() {
return id;
}
/**json 转bean 时会把json中的user_id值赋值给id*/
@JSONField(name="user_id")
public void setId(int id) {
this.id = id;
}
fastjson默认的序列化规则是当你的字段的值为null的时候,它是不会给你序列化这个字段的,即如果name为null的时候,得到的json中不会出现name这个属性。
这时候可以这样
@JSONField(serialzeFeatures=SerializerFeature.WriteMapNullValue)
private String name;
结果