fastjson整合到spring boot中
fastjson集成到spring boot中,使用经验
中文乱码问题
private属性问题
解决序列号字段顺序问题
解决报错:Request processing failed; nested exception is java.lang.IllegalArgumentException: Content-Type cannot contain wildcard type '*'
一、背景
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式。
除了json,我们常见的格式还有XML、yml等
JSON在前端JavaScript中应用得较多,内存中的对象可以使用json格式的字符串来表示自己的结构和数据,这称之为序列化;
而将json格式的字符串转化为内存中的对象被称之为反序列化
因为前端使用较多,各种语言的后端也形成了自己的序列化、反序列化工具
Java spring boot默认使用jackson来序列、反序列化
从几年前的性能测试对比数据来看,fastjson序列化较快,反序列化没有明显优势
引入fastjson前博主习惯去掉jackson依赖:
<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>
二、fastjson整合到spring boot中
单纯地引入依赖,只能在代码中主动地调用fastjson,整合到spring boot后,所有controller传入的类和返回的类都会由fastjson来做反序列化和序列化
个人喜欢写配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
// WebMvcConfigurerAdapter 这个类在SpringBoot2.0已过时,官方推荐直接实现WebMvcConfigurer 这个接口
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//自定义配置...
// FastJsonConfig config = new FastJsonConfig();
// config.set...
// converter.setFastJsonConfig(config);
// 高版本无需配置,低版本不配置报错:Content-Type cannot contain wildcard type '*'
// List<MediaType> fastMediaTypes = new ArrayList<>();
// fastMediaTypes .add(MediaType.APPLICATION_JSON);
// fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
// converter.setSupportedMediaTypes(fastMediaTypes);
converters.add(0, converter);
}
}
FastJsonConfig中可以配置一些日期格式、循环引用等特性
三、一些使用问题
3.1 序列化字段排序问题
jackson序列化出来json,其字段顺序和声明顺序一致
但是fastjson序列化时,故意按字母排序,可能是为了速度的原因
一般来说不会影响使用
如果有排序需求,目前有几种方法,按推荐程度由高到低
-
在类的每个字段都加上注解
@JSONField(ordinal = 1)
这个是最实用的,见效快
-
来自GitHub issue,没试验过,代码看不懂...
JSON.DEFAULT_GENERATE_FEATURE &= ~SerializerFeature.SortField.getMask();
SerializeConfig serializeConfig = new SerializeConfig(true);
System.out.println(JSON.toJSONString(javaObject, serializeConfig));
3.2 private字段序列化问题
private修饰的字段如果没有getter、setter则序列化不会显示
end
相关文章:
《jndi ldap/rmi RCE介绍:fastjsion反序列化漏洞,log4j2命令执行》
《spring (boot)使用log4j2实现slf4j日志门面》