要分析三者的区别,首先我们要知道他们内部的实现原理,所以我们先看他们的源码实现:
getString(String key)方法的源码如下:
public String getString(String name) throws JSONException {
Object object = get(name);
String result = JSON.toString(object);
if (result == null) {
throw JSON.typeMismatch(name, object, "String");
}
return result;
}
上面的get(name)方法源码如下:
public Object get(String name) throws JSONException {
Object result = nameValuePairs.get(name);
if (result == null) {
throw new JSONException("No value for " + name);
}
return result;
}
我们可以看到上面的get(name)方法会返回一个不为null的object对象,如果返回值为null,则抛出“JSONException("No value for " + name)”的异常。
同样的,当getString(String name)方法的返回值result为null的时候,也会抛出JSON.typeMismatch(name, object, “String”)的异常,但是getString(String name)方法会异常的处理并不彻底,因为Object object = get(name)这行代码中我们获取到的object对象有可能为空null,这就可能导致接下来的这行代码String result = JSON.toString(object)抛出NullPointerException空指针异常。所以我们可以知道getString(String name)是不安全的,稍有疏忽就会报空指针。
再来看看get(String name)方法,其实这个方法上面已经分析了,这里我们不再累述。
我们看看opt(String name)方法,他的源码是这样的:
public Object opt(String name) {
return nameValuePairs.get(name);
}
上面方法中,nameValuePairs变量是一个LinkedHashMap<String, Object> nameValuePairs,这个方法里面,既没有对传进来的name参数做判断,也没有对从nameValuePairs获取到的value值做判断,完全是有可能返回一个空对象,甚至在name这个key值为空的时候直接抛出NullPointerException空指针异常。所以opt(String name)方法也是不安全的。
最后我们再来看看optString(String name)方法,他的源码是这样的:
public String optString(String name) {
return optString(name, "");
}
这里很简单,看不出细节,我们深入optString(name, “”)方法看看:
public String optString(String name, String fallback) {
Object object = opt(name);
String result = JSON.toString(object);
return result != null ? result : fallback;
}
这里optString()方法同样是用到了opt()方法,同样也是没有对opt()的返回值object做判断,虽然后面对result做了判断,但是并没有完全避免问题的出现。这情况倒是跟前面的getString()方法类似。
综上所述,get()、opt()、getString()、optString()四个方法:
1、get()、opt()两个方法返回的是一个Object对象,其中get()方法对LinkedHashMap<String, Object> nameValuePairs获取到的值做了null判断,返回的值不会是null(为null的时候,会自动抛出JSONException("No value for " + name)异常),我们做开发的时候,拿到object这个对象后基于程序安全和健壮性的考虑回主动的加上null的判断,这样相对更安全。而opt()方法直接从LinkedHashMap对象中获取Value值,而map对象的get方法内部对key值做了处理,是安全的因此不会出现异常,因此我们只需像对get()方法那样对获取到的value值做判断处理就行,
2、getString()、optString()两个方法内部都对返回值做了处理,要么反悔具体值,要么直接抛出异常,我们不用对获取到的值做null判断,但是由于他的内部对object对象的处理不彻底,并且没有加try{}catch(Exception e){}进行异常的捕捉,因此这两个方法都有可能直接报NullPointerException空指针异常。
3、因此,从上面的分析,我们可以得知,getString()、optString()两个方法我们尽可能的少用,避免不必要的NullPointerException空指针异常。get()方法内部比opt()方法内部多了一层null的判断,为空时,抛出JSONException("No value for " + name)异常,对null这种情况的处理更彻底,因此建议多用。当然如果想自己处理异常,便于开发调试,那么用opt()也是不错的选择。