zoukankan      html  css  js  c++  java
  • JSON.toJSONString的坑有些字段没有了

    1.问题
     在使用fastjson中的JSON.toJSONString方法将对象转换成json字符串的时候,发现有些字段没有了。如:

    1
    2
    3
    4
    5
    6
    7
    8
    public static void main(String[] args) {
            Map<String,Object>map=new HashMap<>();
            map.put("id","1");
            map.put("name",null);
            System.out.println(JSON.toJSONString(map));
        }
        
     输出结果: {"id":"1"}

    输出结果中没有了 "name"这个属性了;

    2.解决方式
    加SerializerFeature.WriteMapNullValue)

    复制代码
    public static void main(String[] args) {
            Map<String,Object>map=new HashMap<>();
            map.put("id","1");
            map.put("name",null);
            System.out.println(JSON.toJSONString(map,SerializerFeature.WriteMapNullValue));
        }
    
    
    输出结果: {"name":null,"id":"1"}
    复制代码

    3.原因

    转json串,默认设置了许多序列化配置:

    名称 含义 备注
    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 把 做转义输出,默认为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 不是String的字段写为String      
    NotWriteDefaultValue 不设默认值       
    BrowserSecure    
    IgnoreNonFieldGetter 忽略没有getter方法的属性  
    WriteEnumUsingName 目前版本的fastjson默认对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序列化即可。
     
  • 相关阅读:
    C++ *和&
    leetcode 338. Bit位计数
    leetcode 216. 组合总和 III
    leetcode 40. 组合总和 II
    c++ vector 常用函数
    leetcode 491. 递增子序列
    leetcode 441. 排列硬币
    leetcode 258. 各位相加
    leetcode 415. 字符串相加
    leetcode 67. 二进制求和
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/13680369.html
Copyright © 2011-2022 走看看