如何测试JSONObject是否为空或不存在

时间:2012-09-25 14:47:33

标签: java android json

我有一组JSONObject值,我从服务器接收并进行操作。大多数情况下,我得到一个带有值的JSONObject(比方说统计数据),有时会返回一个Error对象,其中包含代码和错误描述。

如何构造我的代码,以便在返回错误时不会中断。我以为我可以做到这一点,但是不起作用。

public void processResult(JSONObject result) {
    try {
        if(result.getJSONObject(ERROR) != null ){
            JSONObject error = result.getJSONObject(ERROR);
            String error_detail = error.getString(DESCRIPTION);
            if(!error_detail.equals(null)) {
                //show error login here
            }
            finish();
        }
        else {
            JSONObject info = result.getJSONObject(STATISTICS);
            String stats = info.getString("production Stats"));
        }
    }
}

4 个答案:

答案 0 :(得分:68)

使用.has(String).isNull(String)

保守用法可能是;

    if (record.has("my_object_name") && !record.isNull("my_object_name")) {
        // Do something with object.
      }

答案 1 :(得分:9)

在JSON对象中,您可以使用“Has”方法来确定密钥。

我不知道这是否有效,但看起来很可信。

public void processResult(JSONObject result) {

    if(result.has("ERROR"))
    {
        JSONObject error = result.getJSONObject("ERROR")
        String error_detail = error.getString("DESCRIPTION");

        if(error_detail != null)
        {
            //Show Error Login
            finish();
        }
    }
    else if(result.has("STATISTICS"))
    {
        JSONObject info = result.getJSONObject("STATISTICS");
        String stats = info.getString("Production Stats");

        //Do something
    }
    else
    {
        throw new Exception("Could not parse JSON Object!");
    }
}

答案 2 :(得分:6)

可能会有点迟(这是肯定的)但是将其发布给未来的读者

您可以使用不会抛出任何异常的JSONObject optJSONObject (String name)

  

如果存在并且是JSONObject,则返回按名称映射的值,否则返回null。

所以你可以做到

JSONObject obj = null;
if( (obj = result.optJSONObject("ERROR"))!=null ){
      // it's an error , now you can fetch the error object values from obj
}

或者如果您只是想在不提取值的情况下测试无效,那么

if( result.optJSONObject("ERROR")!=null ){
    // error object found 
}

opt functions的整个系列可以返回null,也可以使用重载版本使它们返回任何预定义的值。 e.g

String optString (String name, String fallback)

  

返回按名称映射的值(如果存在),如果是则强制转换它   必要的,或者如果不存在这样的映射则回退。

其中coercing表示,它会尝试将值转换为字符串类型

@TheMonkeyMan的修改版本,以消除多余的查找

public void processResult(JSONObject result) {
    JSONObject obj = null;
    if( (obj = result.optJSONObject("ERROR"))!=null ){
       //^^^^ either assign null or jsonobject to obj
      //  if not null then  found error object  , execute if body                              
        String error_detail = obj.optString("DESCRIPTION","Something went wrong");
        //either show error message from server or default string as "Something went wrong"
        finish(); // kill the current activity 
    }
    else if( (obj = result.optJSONObject("STATISTICS"))!=null ){
        String stats = obj.optString("Production Stats");
        //Do something
    }
    else
    {
        throw new Exception("Could not parse JSON Object!");
    }
}

答案 3 :(得分:0)

与使用Java的null值相比,使用NULL对象有时更方便且更明确。

  • JSONObject.NULL.equals(null)返回true。

    JSONObject.NULL.toString()返回“ null”。

示例:

System.out.println(test.get(“ address”)。equals(null)); //首选方式 System.out.println(test.getString(“ address”)。equals(“ null”));

源-JSONObject Oracle文档