当前位置 主页 > 网站技术 > 代码类 >

    解决fastjson从1.1.41升级到1.2.28后报错问题详解(2)

    栏目:代码类 时间:2020-02-07 18:05

    所以,需要为ViewAwareJsonMessageConverter设置supportedMediaTypes:

    <bean class="cn.com.autodx.common.jsonView.ViewAwareJsonMessageConverter">
      <property name="supportedMediaTypes">
        <list>
          <value>application/json;charset=UTF-8</value>
          <value>application/*+json;charset=UTF-8</value>
        </list>
      </property>
    </bean>

    新版本序列化默认不再对字段进行排序

    这个是一个签名算法的场景:客户端对参数进行序列化,然后md5加密成一个签名;服务端按照相同的算法解析一遍参数,对比签名值。这里加密依赖json序列化之后的字符串,也就依赖序列化时字段的排序。

    这是fastjson做了一个性能优化,将排序需求抽象出一个SerializerFeature,供用户自己配置。如果需要排序场景,在序列化时添加参数SerializerFeature.MapSortField即可,即:

    JSON.toJSONString(obj, SerializerFeature.MapSortField);

    官方文档

    1.2.3之后的版本,Map的序列化没有做排序再输出,原因是通过TreeMap排序很影响性能。

    1.2.27版本中增加SerializerFeature.MapSortField实现同样的功能。

    使用方法如下:

    a) 传入SerializerFeature.MapSortField参数。 JSON.toJSONString(map, SerializerFeature.MapSortField);

    b) 通过代码修改全局缺省配置。 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.MapSortField.getMask();

    c) 通过JVM启动参数配置修改全局配置 -Dfastjson.serializerFeatures.MapSortField=true

    d) 通过类路径下的fastjson.properties来配置 fastjson.serializerFeatures.MapSortField=true

    新老版本序列化和反序列化不兼容,会出乱码。

    更多关于fastjson的相关文章请点击下面的相关链接