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来做反序列化和序列化

官方做法

个人喜欢写配置类

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

一般来说不会影响使用

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

  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

相关文章:

《jndi ldap/rmi RCE介绍:fastjsion反序列化漏洞,log4j2命令执行》

《spring (boot)使用log4j2实现slf4j日志门面》


posted @ 2022-01-03 15:08  云牧青  阅读(1146)  评论(0编辑  收藏  举报