json版本:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
假设一个json,格式为:
{
“code”:200,
“message”:”OK”,
“detail”:{
“id”:”123”,
“name”:”liuyang”
}
}
或者
{
“code”:200,
“message”:”FAIL”,
“detail”:null
}
需要判断detail是否为空,开始的做法是:
JSONObject detail = obj.getJSONObject("detail");
if(detail!=null){ //do something }
结果不论哪种json,都能进去。。这是一个大坑。。
然后试着随便调了个方法,也不会报空指针异常。
String json = "{\"code\":200,\"message\":\"FAIL\",\"detail\":null}";
@Test
public void testNull(){
JSONObject object = JSONObject.fromObject(json);
JSONObject detail = object.getJSONObject("detail");
System.out.println(detail.toString());
if(detail!=null && !"null".equals(detail)){
System.out.println("detail is not null");
}
}
}
运行结果:
null
detail is not null
这个jsonobject可以输出为null,但是不等于null或“null”。。
我用了containsKey方法来判断该值是否为空,
即obj.containsKey(“id”);
若该json对象中存在该key则该对象不为空
String json = "{\"code\":200,\"message\":\"FAIL\",\"detail\":null}";
@Test
public void testNull(){
JSONObject object = JSONObject.fromObject(json);
JSONObject detail = object.getJSONObject("detail");
System.out.println(detail.toString());
if(detail.containsKey("id")){
System.out.println("obj is not null");
}else{
System.out.println("obj is null");
}
}
输出结果:
null
obj is null
网上也有说用isEmpty() 和isNullObject()的,应该也是可以的,但是个人觉得这两个方法在名称上过于类似,容易混淆,为了避免不必要的错误,还是尽量少用为好。