zoukankan      html  css  js  c++  java
  • 使用fastjson将list、map转换成json,出现$ref

    这是转换时出现的问题情况( map >> json )

    引用是通过"$ref"来表示的

    引用描述
    "$ref":".." 上一级
    "$ref":"@" 当前对象,也就是自引用
    "$ref":"$" 根对象
    "$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0)

    如果出现这种情况在前端肯定是无法解析json成功的,所以要处理一下避免出现问题

    处理方法:

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;

    JSON.toJSONString(..., SerializerFeature.DisableCircularReferenceDetect)

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    引申:

    名称 含义 备注
     QuoteFieldNames  输出key时是否使用双引号,默认为true  
     UseSingleQuotes  使用单引号而不是双引号,默认为false  
     WriteMapNullValue  是否输出值为null的字段,默认为false  
     WriteEnumUsingToString  

    Enum输出name()或者original,默认为false


    目前版本的fastjon默认对enum对象使用WriteEnumUsingName属性,因此会将enum值序列化为其Name。
    使用WriteEnumUsingToString方法可以序列化时将Enum转换为toString()的返回值;同时override toString函数能够将enum值输出需要的形式。但是这样做会带来一个问题,对应的反序列化使用的Enum的静态方法valueof可能无法识别自行生成的toString(),导致反序列化出错。
    如果将节省enum序列化后的大小,可以将enum序列化其ordinal值,保存为int类型。fastJson在反序列化时,如果值为int,则能够使用ordinal值匹配,找到合适的对象。
    fastjson要将enum序列化为ordinal只需要禁止WriteEnumUsingName feature。
    首先根据默认的features排除WriteEnumUsingName,然后使用新的features序列化即可。

    int features=SerializerFeature.config(JSON.DEFAULT_GENERATE_FEATURE, SerializerFeature.WriteEnumUsingName, false)
    JSON.toJSONString(obj,features,SerializerFeature.EMPTY);

     
     WriteEnumUsingName    
     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  把 做转义输出,默认为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输出  不推荐

    使用 :JSONObject.toJSONString(实体, SerializerFeature.WriteMapNullValue))

  • 相关阅读:
    struts2(2.0.x到2.1.2版本)的核心和工作原理(转)
    关于Struts2通配符无效的说明
    contOS 网络配置
    INFORMATICA 开发规范
    Python tricks(1) -- 动态定义一个新变量
    MySQL connector c++使用笔记
    python使用set来去重碰到TypeError: unhashable type
    Redis 资料整理
    Ruby 安装和gem配置
    爱读书的犹太人
  • 原文地址:https://www.cnblogs.com/zhengguangpan/p/10006691.html
Copyright © 2011-2022 走看看