Java 如何测试JSONObject是否为null或不';不存在

Java 如何测试JSONObject是否为null或不';不存在,java,android,json,Java,Android,Json,我有一组JSONObject值,我从服务器接收这些值并对其进行操作。大多数时候,我得到一个带有值的JSONObject(比如统计),有时,它返回一个带有代码和错误描述的Error对象 如何构造代码,使其在返回错误时不会中断。我以为我能做到,但没用 public void processResult(JSONObject result) { try { if(result.getJSONObject(ERROR) != null ){ JSONObj

我有一组
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"));
        }
    }
}

在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!");
    }
}
使用
.has(String)
.isNull(String)

保守的用法可能是

    if (record.has("my_object_name") && !record.isNull("my_object_name")) {
        // Do something with object.
      }
这可能有点晚(这是肯定的),但张贴给未来的读者

您可以使用不会引发任何异常和

返回按名称映射的值(如果该值存在并且是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 
}
有一个完整的系列,它要么返回
null
,要么您也可以使用重载版本使它们返回任何预定义的值。 e、 g

返回按名称映射的值(如果存在),如果存在则强制该值 必要时,如果不存在此类映射,则返回

其中,
强制
意味着,它将尝试将值转换为字符串类型


@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!");
    }
}

有时,使用NULL对象比使用Java的NULL值更方便,也不那么模棱两可

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

    toString()返回“NULL”

例如:

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


source--JSONObject oracle docs

目前出现了什么问题?有趣的是,我单独使用了isNull()方法,但也遇到了同样的问题。发布包含键错误的JSON消息,并提供异常类型,我们将立即对此进行排序。:)您是否对@sparrow进行了排序?@RobertN:“has”检查JSONObject是否包含特定键。“isNull”检查与键关联的值是否为null或是否没有值@OceanLife如果使用isNull(字符串s),则可以跳过has(字符串s)。isNull(字符串s)检查与has(字符串s)相同的值,并另外检查值是否为“null”