• FastJson 常见问题


    一、场景

    在使用序列化的时候,Object里包含了两个一模一样的对象,所以解析的时候,只有第一个能解析出来,另外一个无法显示。

    查看了json的序列化源码,发现是DisableCircularReferenceDetecte特性,防止对象互相引用,导致死循环的解析。

    可以使用String jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect )来解决。

    二、上网搜了资料,才发现fastjson有很多常见的问题,转载自https://my.oschina.net/zhongwenhao/blog/212101

    1. fastjson主要的API哪些?

    fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString,和parseObject。

    package com.alibaba.fastjson;
      public abstract class JSON {
            public static final String toJSONString(Object object);
            public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
      }

    序列化:

    String jsonString = JSON.toJSONString(obj);

    反序列化:

    VO vo = JSON.parseObject("...", VO.class);

    泛型反序列化:

    import com.alibaba.fastjson.TypeReference;
    
      List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});

    2. fastjson的性能如何?

    fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果看这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。

    自行做性能测试时,关闭循环引用检测的功能。

    JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)
      VO vo = JSON.parseObject("...", VO.class, Feature.DisableCircularReferenceDetect)

    这里有jackson作者cowtowncoder等人对fastjson的性能评价: https://groups.google.com/forum/#!topic/java-serialization-benchmarking/8eS1KOquAhw

    3. fastjson性能比gson怎样?

    fastjson比gson快大约6倍,测试结果上这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。gson的g可能是“龟”拼音的缩写,龟速的json库。

    4. fastjson序列化的需要像json-lib一样配置java bean的序列化么?

    不需要,fastjson的序列化和反序列化都不需要做特别配置,唯一的要求是,你序列化的类符合java bean规范。

    5. fastjson如何处理日期

    fastjson处理日期的API很简单,例如:

    JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")

    使用ISO-8601日期格式

    JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);

    全局修改日期格式

    JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
      JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

    反序列化能够自动识别如下日期格式:

    • ISO-8601日期格式
    • yyyy-MM-dd
    • yyyy-MM-dd HH:mm:ss
    • yyyy-MM-dd HH:mm:ss.SSS
    • 毫秒数字
    • 毫秒数字字符串
    • .NET JSON日期格式
    • new Date(198293238)

    6. 如何定制序列化?

    你可以使用SimplePrePropertyFilter过滤字段,详细看这里:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=7673519

    关于定制序列化,详细的介绍看这里: https://github.com/alibaba/fastjson/wiki/%E5%AE%9A%E5%88%B6%E5%BA%8F%E5%88%97%E5%8C%96

    7. 当对象存在引用是,序列化后的结果浏览器不支持,怎么办?

    使用SerializerFeature.DisableCircularReferenceDetect特性关闭引用检测和生成。例如:

    String  jsonString = JSON.toJSONString(obj, 
              SerializerFeature.DisableCircularReferenceDetect
              );

    8. IE 6不支持JSON带中文字符串,要怎么处理?

    fastjson提供了BrowserCompatible这个配置,打开之后,所有的中文都会序列化为uXXXX这种格式,字节数会多一些,但是能兼容IE 6。

    String  jsonString = JSON.toJSONString(obj, 
              SerializerFeature.BrowserCompatible
              );

    9. fastjson 如何处理超大对象和超大JSON文本

    fastjson提供了Stream API,详细看这里 https://github.com/alibaba/fastjson/wiki/Stream-api

  • 相关阅读:
    学习GlusterFS(二)
    并不对劲的莫比乌斯反演
    并不对劲的WC2019
    并不对劲的loj2134:uoj132:p2304:[NOI2015]小园丁与老司机
    并不对劲的bzoj3626:loj2558:p4211:[LNOI2014]LCA
    并不对劲的bzoj3214:p3333:[ZJOI2013]丽洁体
    并不对劲的bzoj4827:loj2020:p3723:[AHOI/HNOI2017]礼物
    并不对劲的bzoj4560:p3269:[JLOI2016]字符串覆盖
    并不对劲的p2664树上游戏
    并不对劲的p3709:大爷的字符串题
  • 原文地址:https://www.cnblogs.com/jiangxiaoyaoblog/p/6089875.html
Copyright © 2020-2023  润新知