簡體   English   中英

如何測試 JSONObject 是否為空或不存在

[英]How to test if a JSONObject is null or doesn't exist

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

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

保守的用法可能是;

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

可能有點晚(這是肯定的),但將其發布給未來的讀者

您可以使用不會拋出任何異常的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!");
    }
}

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

有時,使用 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 文檔

只是一個說明:

使用 EE8 json 規范,我可以進行異常安全的獲取:

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

但是,如果我想做一個檢查,我可以這樣做:

result.asJsonObject().get("ERROR").equals(JsonValue.NULL)

如果在您的代碼中的任何一點, org.json.JSONObject json_object變為null並且您希望避免NullPointerException (java.lang.NullPointerException),請按如下方式進行檢查:

if(json_object == null) {
   System.out.println("json_object is found as null");
  }
  else {
       System.out.println("json_object is found as not null");
  }

如果在任何情況下,您的 jsonobject 為空。 然后使用此語句檢查 jsonobject 是否為空。

if (!obj.get("data").isJsonNull()){
   //Not Null
}else{
   //Null
}

要檢查 jsonobject 是否存在,請使用 .has:

if (!obj.has("data")){
   //Not Exist
}else{
   //Exist
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM