AI智能
改变未来

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 的兴起与崛起

除了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序列化时,故意按字母排序,可能是为了速度的原因

一般来说不会影响使用

如果有排序需求,目前有几种方法,按推荐程度由高到低

  1. 在类的每个字段都加上注解

    @JSONField(ordinal = 1)

    这个是最实用的,见效快

  2. 来自GitHub issue,没试验过,代码看不懂…

JSON.DEFAULT_GENERATE_FEATURE &= ~SerializerFeature.SortField.getMask();SerializeConfig serializeConfig = new SerializeConfig(true);System.out.println(JSON.toJSONString(javaObject, serializeConfig));
  1. 来自官方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日志门面》

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » fastjson整合到spring boot中