ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

fastjson

2022-05-13 23:34:23  阅读:206  来源: 互联网

标签:fastjson false String 默认 JSON 引用 ref


  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有