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

iro*_*xxx 27 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"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Oce*_*ife 74

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

保守的用法可能是;

    if (record.has("my_object_name") && !record.isNull("my_object_name")) {
        // Do something with object.
      }
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,我单独使用了isNull()方法但遇到了同样的麻烦. (3认同)
  • @RobertN:"has"检查JSONObject是否包含特定键."isNull"检查与键关联的值是否为null或者是否没有值.http://www.json.org/javadoc/org/json/JSONObject.html#has%28java.lang.String%29 (2认同)
  • @OceanLife如果使用isNull(String s),则可以跳过has(String s)。isNull(String s)检查与has(String s)相同,并另外检查value是否为'null' (2认同)

The*_*Man 9

在JSONObject中,您可以执行"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!");
    }
}
Run Code Online (Sandbox Code Playgroud)


Pav*_*ngh 7

它可能会有点晚(这是肯定的),但发布给未来的读者

你可以使用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
}
Run Code Online (Sandbox Code Playgroud)

或者如果您只是想在不获取值的情况下测试nullity

if( result.optJSONObject("ERROR")!=null ){
    // error object found 
}
Run Code Online (Sandbox Code Playgroud)

有一整套opt函数可以返回null,也可以使用重载版本使它们返回任何预定义的值.例如

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)