为毛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)

不过,心里不爽,为毛不起作用啊?SerializerFeature.WriteNullStringAsEmpty

fastjson github: https://github.com/alibaba/fastjson


慕勒3428872
浏览 2548回答 2
2回答

交互式爱情

你列举的大部分SerializerFeature主要是针对Object对象序列化转换时的情况(这个时候才能判断参数的类型),而在Map中,你放进入了null就是null,进行序列化时已经没法判断它原来的类型了,所以并没有起作用。要使用SerializerFeature里相关null的参数,应该传入对象进行序列化。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java