fastjson解析null值处理 null的属性不显示

 

转载自:http://blog.csdn.net/l253272670/article/details/54912230

在做json解析时发现,fastjson处理null时,结果会把null的字段以及值给过滤,业务上需要保留null值。直接上代码

 

[java]  view plain  copy
 
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.   
  4. import com.alibaba.fastjson.JSON;  
  5. import com.alibaba.fastjson.JSONObject;  
  6. import com.alibaba.fastjson.serializer.SerializerFeature;  
  7.   
  8. public class FastJsonTest {  
  9.     public static void main(String[] args) {  
  10.         /* 
  11.          * QuoteFieldNames———-输出key时是否使用双引号,默认为true 
  12.          * WriteMapNullValue——–是否输出值为null的字段,默认为false 
  13.          * WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null 
  14.          * WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null 
  15.          * WriteNullStringAsEmpty—字符类型字段如果为null,输出为"",而非null 
  16.          * WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null 
  17.          */  
  18.         Map jsonMap = new HashMap();  
  19.         jsonMap.put("a"1);  
  20.         jsonMap.put("b""");  
  21.         jsonMap.put("c"null);  
  22.         jsonMap.put("d""json");  
  23.   
  24.         String str = JSONObject.toJSONString(jsonMap);  
  25.         // ①忽略null输出  
  26.         System.out.println(str);  
  27.   
  28.         String str2 = JSONObject.toJSONString(jsonMap,  
  29.                 SerializerFeature.WriteMapNullValue);  
  30.         // ②  
  31.         System.out.println(str2);  
  32.   
  33.         String json = "{\"fail\":null,\"updateTimestamp\":\"1484096131863\",\"productName\":\"json测试\"}";  
  34.         // ③忽略null输出  
  35.         System.out.println(JSON.parse(json));  
  36.         // ④  
  37.         System.out.println(JSONObject.toJSON(json));  
  38.     }  
  39.   
  40. }  

输出结果:

 

 

[java]  view plain  copy
 
  1. ①:{"a":1,"b":"","d":"json"}  
  2. ②:{"a":1,"b":"","c":null,"d":"json"}  
  3. ③:{"productName":"json测试","updateTimestamp":"1484096131863"}  
  4. ④:{"fail":null,"updateTimestamp":"1484096131863","productName":"json测试"}  

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

你可能感兴趣的:(java学习)