开发者社区> 问答> 正文

为什么fastjson字段为null时不输出空字符串?

Map < String , Object > jsonMap = new HashMap< String , Object>();  
jsonMap.put("a",1);  
jsonMap.put("b","");  
jsonMap.put("c",null);  
jsonMap.put("d","wuzhuti.cn");  
  
String str = JSONObject.toJSONString(jsonMap);  
System.out.println(str);  
//输出结果:{"a":1,"b":"",d:"wuzhuti.cn"}  

从输出结果可以看出,null对应的key已经被过滤掉;这明显不是我们想要的结果,这时我们就需要用到fastjson的SerializerFeature序列化属性

也就是这个方法:JSONObject.toJSONString(Object object, SerializerFeature... features)
SerializerFeature有用的一些枚举值
`QuoteFieldNames———-输出key时是否使用双引号,默认为true
WriteMapNullValue——–是否输出值为null的字段,默认为false
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null`
现在加上
`Map < String , Object > jsonMap = new HashMap< String , Object>();
jsonMap.put("a",1);
jsonMap.put("b","");
jsonMap.put("c",null);
jsonMap.put("d","wuzhuti.cn");
String str = JSONObject.toJSONString(jsonMap,SerializerFeature.WriteMapNullValue);
System.out.println(str);
//输出结果:{"a":1,"b":"","c":null,"d":"wuzhuti.cn"} `
但是,如果把WriteNullStringAsEmpty也加进去,为什么不起作用?

String str = JSONObject.toJSONString(jsonMap,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty);  
System.out.println(str);  
//输出结果:{"a":1,"b":"","c":null,"d":"wuzhuti.cn"}  

目前的解决办法是加一个过滤器

private ValueFilter filter = new ValueFilter() {
    @Override
    public Object process(Object obj, String s, Object v) {
    if(v==null)
        return "";
    return v;
    }
};
JSON.toJSONString(jsonMap, filter)

展开
收起
蛮大人123 2016-03-09 18:31:25 7400 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    对规则的理解:

    1.SerializerFeature.WriteMapNullValue 是否输出值为null的字段,默认为false
    也就是说有null时会输出而不是忽略(默认策略是忽略,所以看不到为null的字段)
    2.WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
    注意是字段是字段是字段,而不是json.put("key",null),所以用它时,字段为null的可以转换为空字符串。
    3.如果让输出的json中所有为null的字符串都变成空字符串,最简单的做法就是加一个值过滤器,这样就避免了有的字段为null,有的字段为空字符的现象。
    贴点示例代码:

    public class Demo1 {
    
        public class Student {
            private String name;
            private int age;
            private boolean isMale;
            private Student gf;
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
    
            public boolean isMale() {
                return isMale;
            }
    
            public void setMale(boolean isMale) {
                this.isMale = isMale;
            }
    
            public Student getGf() {
                return gf;
            }
    
            public void setGf(Student gf) {
                this.gf = gf;
            }
        }
    
        private static ValueFilter filter = new ValueFilter() {
            @Override
            public Object process(Object obj, String s, Object v) {
                if (v == null)
                    return "";
                return v;
            }
        };
    
        public static void main(String[] args) {
            new Demo1().foo();
            new Demo1().bar();
        }
    
        private void foo() {
            System.out.println("foo()---------------------------");
            JSONObject j1 = new JSONObject();
            j1.put("name", "zhangsan");
            j1.put("age", 13);
            j1.put("isMale", true);
            j1.put("gf", null);
            Map<String, Object> fav = new HashMap<String, Object>();
            Set<String> books = new HashSet<String>();
            books.add("三国");
            books.add("史记");
            fav.put("history", books);
            String[] arts = new String[] {};
            fav.put("arts", arts);
            String[] musics = new String[] { "北京欢迎你", "画心" };
            fav.put("musics", musics);
            List<String> sports = new ArrayList<String>();
            fav.put("sports", sports);
            j1.put("fav", fav);
            List<Student> classmates = new ArrayList<Student>();
            classmates.add(new Student());
            Student lisi = new Student();
            lisi.setMale(false);
            lisi.setAge(11);
            classmates.add(lisi);
            Student zhangsan = new Student();
            zhangsan.setAge(13);
            zhangsan.setName("张三");
            zhangsan.setMale(true);
            zhangsan.setGf(lisi);
            classmates.add(zhangsan);
            j1.put("classmates", classmates);
            String str = null;
            j1.put("str", str);
            System.out.println(j1.toString());
            System.out
                .println(JSON.toJSONString(j1, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(
                JSON.toJSONString(j1, filter, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(JSON.toJSONString(j1, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(JSON.toJSONString(j1, filter, SerializerFeature.WriteNullStringAsEmpty));
    
            Map<String, JSONObject> m = new HashMap<String, JSONObject>();
            m.put("key", j1);
            System.out.println(
                JSON.toJSONString(m, SerializerFeature.WriteNonStringKeyAsString, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(JSON.toJSONString(m, filter, SerializerFeature.WriteNonStringKeyAsString,
                SerializerFeature.WriteNullStringAsEmpty));
    
        }
    
        private void bar() {
            System.out.println("bar()---------------------------");
            Student zhangsan = new Student();
            zhangsan.setAge(13);
            zhangsan.setName("张三");
            zhangsan.setMale(true);
            Student lisi = new Student();
            // lisi.setName("lisi");
            lisi.setMale(false);
            lisi.setAge(11);
            zhangsan.setGf(lisi);
            System.out.println(
                JSON.toJSONString(zhangsan, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(JSON.toJSONString(zhangsan, SerializerFeature.WriteMapNullValue));
            System.out.println(JSON.toJSONString(zhangsan, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(JSON.toJSONString(zhangsan));
            System.out.println(JSON.toJSONString(zhangsan, filter));
            System.out.println(JSON.toJSONString(zhangsan, filter, SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty));
        }
    }

    输出结果:
    `foo()---------------------------
    {"isMale":true,"name":"zhangsan","classmates":[{"age":0,"male":false},{"age":11,"male":false},{"age":13,"gf":{"$ref":"$.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13}
    {"str":null,"isMale":true,"name":"zhangsan","classmates":[{"age":0,"gf":null,"male":false,"name":""},{"age":11,"gf":null,"male":false,"name":""},{"age":13,"gf":{"$ref":"$.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13,"gf":null}
    {"str":"","isMale":true,"name":"zhangsan","classmates":[{"age":0,"gf":"","male":false,"name":""},{"age":11,"gf":"","male":false,"name":""},{"age":13,"gf":{"$ref":"$.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13,"gf":""}
    {"isMale":true,"name":"zhangsan","classmates":[{"age":0,"male":false},{"age":11,"male":false},{"age":13,"gf":{"$ref":"$.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13}
    {"str":"","isMale":true,"name":"zhangsan","classmates":[{"age":0,"gf":"","male":false,"name":""},{"age":11,"gf":"","male":false,"name":""},{"age":13,"gf":{"$ref":"$.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13,"gf":""}
    {"key":{"isMale":true,"name":"zhangsan","classmates":[{"age":0,"male":false},{"age":11,"male":false},{"age":13,"gf":{"$ref":"$.key.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13}}
    {"key":{"str":"","isMale":true,"name":"zhangsan","classmates":[{"age":0,"gf":"","male":false,"name":""},{"age":11,"gf":"","male":false,"name":""},{"age":13,"gf":{"$ref":"$.key.classmates[1]"},"male":true,"name":"张三"}],"fav":{"sports":[],"musics":["北京欢迎你","画心"],"history":["史记","三国"],"arts":[]},"age":13,"gf":""}}
    bar()---------------------------
    {"age":13,"gf":{"age":11,"gf":null,"male":false,"name":""},"male":true,"name":"张三"}
    {"age":13,"gf":{"age":11,"gf":null,"male":false,"name":null},"male":true,"name":"张三"}
    {"age":13,"gf":{"age":11,"male":false},"male":true,"name":"张三"}
    {"age":13,"gf":{"age":11,"male":false},"male":true,"name":"张三"}
    {"age":13,"gf":{"age":11,"gf":"","male":false,"name":""},"male":true,"name":"张三"}
    {"age":13,"gf":{"age":11,"gf":"","male":false,"name":""},"male":true,"name":"张三"}`

    2019-07-17 18:56:32
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载