其他分享
首页 > 其他分享> > fastjson

fastjson

作者:互联网

  1. fastjson是由alibaba开源的一套json处理器。与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的性能优势。功能强大,支持JDK的各种类型,包括基本的JavaBean、Collection、Map、Date、Enum、泛型。不需要例外额外的jar,能够直接跑在JDK上。

  2. Fastjson的最主要的使用入口是com.alibaba.fastjson.JSON

    import com.alibaba.fastjson.JSON;
     
    public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
    public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
    public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
    public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
    public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
    public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
    public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
    public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。
    
  3. JSON.toJSONString出现过的bug:

    // 封装完整响应报文-bug版:
    return JSON.toJSONString(new ResponseTransData<>(responseHead, beforeInsuredRecallDTOList), WriteMapNullValue);
    // 封装完整响应文-修正版:
    return JSON.toJSONString(new ResponseTransData<>(responseHead, beforeInsuredRecallDTOList), WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect);
    

    出现的bug为:

    fastjson把对象转化成json避免$ref:使用DisableCircularReferenceDetect来禁止循环引用检测

    DisableCircularReferenceDetect的作用 : 消除对同一对象循环引用的问题。

    JSON.toJSONString(..., SerializerFeature.DisableCircularReferenceDetect)
    
    • 接口返回的api通过fastjson将实体转化为json字符串时,在传输的数据中如果出现相同的对象,fastjson默认开启引用检测会将相同的对象写成引用的形式
    • 引用是通过"$ref"来表示的
    • 引用分两种,循环引用和重复引用
    引用 描述
    "$ref":".." 上一级
    "$ref":"@" 当前对象,也就是自引用
    "$ref":"$" 根对象
    "$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0)
    • 循环引用和重复引用:

      • 循环引用:即A对象引用B对象,B对象又引用A对象,这种情况是要极力避免的,因为会导致堆栈溢出(StackOverflowError);
      • 重复引用:本次bug就是因为相同的对象出现在两个集合中,所以第二个集合中直接返回的是$ref。一般大家在写代码的过程中,如果出现$ref,通常应该是重复引用问题。
    • $ref问题的解决:

      局部关闭:将该对象在后端转换为json字符串返回给前端,使用SerializerFeature.DisableCircularReferenceDetect关闭循环引用

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

      正常来说,我们的接口返回给前端的是List这种格式,如果采用这个方式,就要将返回值改为String。

  4. fastjson SerializerFeature使用:【坑10 看官网整理】

    名称  含义  备注
    QuoteFieldNames //输出key时是否使用双引号,默认为true   
    UseSingleQuotes //使用单引号而不是双引号,默认为false    
    WriteMapNullValue   //是否输出值为null的字段,默认为false  
    WriteEnumUsingToString  //Enum输出name()或者original,默认为false 
    UseISO8601DateFormat    //Date使用ISO8601格式输出,默认为false  
    WriteNullListAsEmpty    //List字段如果为null,输出为[],而非null  
    WriteNullStringAsEmpty  //字符类型字段如果为null,输出为”“,而非null  
    WriteNullNumberAsZero   //数值字段如果为null,输出为0,而非null 
    WriteNullBooleanAsFalse //Boolean字段如果为null,输出为false,而非null    
    SkipTransientField  //如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true    
    SortField   //按字段名称排序后输出。默认为false 
    WriteTabAsSpecial   //把\t做转义输出,默认为false   不推荐
    PrettyFormat    //结果是否格式化,默认为false    
    WriteClassName  //序列化时写入类型信息,默认为false。反序列化是需用到    
    DisableCircularReferenceDetect  //消除对同一对象循环引用的问题,默认为false 
    WriteSlashAsSpecial //对斜杠’/’进行转义  
    BrowserCompatible   //将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false    
    WriteDateUseDateFormat  //全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);    
    DisableCheckSpecialChar //一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false 
    NotWriteRootClassName   //含义  
    BeanToArray //将对象转为array输出    
    WriteNonStringKeyAsString   //含义  
    NotWriteDefaultValue    //含义  
    BrowserSecure   //含义  
    IgnoreNonFieldGetter    //含义  
    WriteEnumUsingName  //含义
    

标签:fastjson,false,String,默认,JSON,引用,ref
来源: https://www.cnblogs.com/yu-zexin/p/16268717.html