zoukankan      html  css  js  c++  java
  • 为什么fastjson字段为null时不输出空字符串?

    为什么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"}

    对规则的理解:

    1. SerializerFeature.WriteMapNullValue 是否输出值为null的字段,默认为false
      也就是说有null时会输出而不是忽略(默认策略是忽略,所以看不到为null的字段)

    2. WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null 
      注意是字段字段字段,而不是json.put("key",null),所以用它时,字段为null的可以转换为空字符串。

    3. 如果让输出的json中所有为null的字符串都变成空字符串,最简单的做法就是加一个值过滤器,这样就避免了有的字段为null,有的字段为空字符的现象。

    贴点示例代码

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;

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

    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":"张三"}

    转自:https://blog.csdn.net/u012534163/article/details/88741884

  • 相关阅读:
    洛谷 简单字符串 'P1055ISBN号码' 问题
    P1424
    洛谷训练P1008(循环+暴力)
    C语言中一些知识点
    二叉树的基本功能实现方法(C++)
    值传递,引用传递,指针传递
    istringstream、ostringstream、stringstream类介绍
    类模板的友元
    C++ 标准库和标准模板库(STL)
    常用数据类型对应字节数
  • 原文地址:https://www.cnblogs.com/personsiglewine/p/12062837.html
Copyright © 2011-2022 走看看