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 的兴起与崛起
除了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来做反序列化和序列化
官方做法
个人喜欢写配置类
@Configurationpublic class WebConfig implements WebMvcConfigurer {// WebMvcConfigurerAdapter 这个类在SpringBoot2.0已过时,官方推荐直接实现WebMvcConfigurer 这个接口@Overridepublic 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));
-
来自官方wiki
单纯使用这个配置似乎不可行,它可能要配合其他配置才能生效,参考issue #372 #1777
3.2 private字段序列化问题
private修饰的字段如果没有getter、setter则序列化不会显示
end
相关文章:
#topics #no-box-shadow-img{box-shadow:none;height: 120px;}
《jndi ldap/rmi RCE介绍:fastjsion反序列化漏洞,log4j2命令执行》
《spring (boot)使用log4j2实现slf4j日志门面》