JSONObject的get()、getString()、opt()、optString()四者的区别

要分析三者的区别,首先我们要知道他们内部的实现原理,所以我们先看他们的源码实现:
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()也是不错的选择。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值