46

我有一组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

5 回答 5

127

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

保守的用法可能是;

    if (record.has("my_object_name") && !record.isNull("my_object_name")) {
        // Do something with object.
      }
于 2012-09-25T14:58:55.773 回答
15

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

您可以使用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 函数可以返回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!");
    }
}
于 2017-10-25T17:50:42.533 回答
11

在 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!");
    }
}
于 2012-09-25T14:54:05.697 回答
2

有时,使用 NULL 对象比使用 Java 的 null 值更方便,也更不模糊。

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

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

例子:

System.out.println(test.get("地址").equals(null)); // 首选方式 System.out.println(test.getString("address").equals("null"));

来源——JSONObject oracle 文档

于 2019-03-13T13:45:37.770 回答
0

只是一个说明:

使用 EE8 json 规范,我可以进行异常安全的获取:

result.asJsonObject().getString("ERROR", null);

但是,如果我想做一个检查,我可以这样做:

result.asJsonObject().get("ERROR").equals(JsonValue.NULL)
于 2021-10-11T16:38:41.740 回答