从做程序到现在,用JSON也用了好些年了。突然发现JSON在put空值时有时会有key而有时又不会有。为了解除这个疑惑我做了以下测试。 我用的包是:json-lib-2.4-jdk15.jar
例一:
- public static void main(String[] args) {
- JSONObject json = new JSONObject();
- json.put("key", null);
- System.out.println(json);
- }
可以看到,控制输出:{}
由此可见,如果put一个空指针(null)给JSON,JSON会自动屏蔽此key不会有任何处理。
我们再来看看另外一个例子。
例二:
- public static void main(String[] args) {
- JSONObject json = new JSONObject();
- String value = "null";
- json.put("key", value);
- System.out.println(json);
- }
控制台输出:{"key":null}
在例二中,我们将String类型的字符串value的值设置为“null”。此时JSON会带有key及value存在。大家请注意看value为null。并不是“null”不带引号。我猜测应该是JSON自动将字符串“null”转换为可识别的空值。如果我们将value的值设置为非“null”的任何字符,JSON都会带有引号。
综上所述:如果需要在value为空时不显示key,则可以直接传递null。但是如果需要不管在value是否为空时都带有key则需要手动将null转换为“null”字符串即可。
JSONObject 判断字符串null还是null值
目前发现有两种包.两种不一样的json包.
第一种情况是: json包是json-lib包是net.sf.json
研究源码发现.JSONObject里有一段代码是当遇到json串中是null的时候.返回JSONNUll.
所以区分null时这样:
JSONObject jo = JSONObject.fromObject("{a:null,b:\"null\"}");
Object o = jo.get("a");
if(o instanceof JSONNull){
System.out.println("Is empty null");
}else{
System.out.println("is String null");
}
o = jo.get("b");
if(o instanceof JSONNull){
System.out.println("Is empty null");
}else{
System.out.println("is String null");
}
输入的结果为
第二种情况是: org.json的包
JSONObject jo = new JSONObject(("{\"a\":\"null\",\"b\":null}"));
if(jo.get("a") instanceof String){
System.out.println("a is String null");
}else{
System.out.println("a is empty null");
}
if(jo.get("b") instanceof String){
System.out.println("a is String null");
}else{
System.out.println("a is empty null");
}
System.out.println(jo.get("b").getClass());
两种包不一样的返回NUll值