zoukankan      html  css  js  c++  java
  • 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日志门面》


  • 相关阅读:
    为什么杜蕾斯的文案工资月薪5万?
    在独立音乐上,网易云音乐是如何甩了其他音乐平台几条街?
    两次大战,为什么德国成不了世界霸主呢?
    在大城市打拼的你,是想留下还是想攒够了钱回家?
    生存在互联网公司是种怎样的体验?
    5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
    放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权
    中国唯一的科技城
    互联网圈的6大奇葩大产品经理:张小龙不在乎手机碎屏,马化腾让用户一秒变白痴
    为什么说中国快递分两种:一种叫顺丰,一种叫快递?
  • 原文地址:https://www.cnblogs.com/yunmuq/p/15758846.html
Copyright © 2011-2022 走看看