【问题标题】:How to check if a JSON key exists?如何检查 JSON 密钥是否存在?
【发布时间】:2013-07-03 10:59:13
【问题描述】:

所以,我从服务器获取了一些 JSON 值,但我不知道是否会有特定字段。

比如:

{ "regatta_name":"ProbaRegatta",
  "country":"Congo",
  "status":"invited"
}

有时,还会有一个额外的字段,例如:

{ "regatta_name":"ProbaRegatta",
  "country":"Congo",
  "status":"invited",
  "club":"somevalue"
}

我想检查名为“club”的字段是否存在,以便在解析时不会得到

org.json.JSONException: 俱乐部没有价值

【问题讨论】:

  • if(jsonObject.getString("club")!=null){ //在这里获取淡水河谷 }
  • 不,在异常处理代码停止,进一步的解析动作不会运行。
  • @SoftwareSainath 这不起作用,仍然出现异常。
  • String clubvalue="";try(clubvalue=jsonobject.getString("club");}catch(Exception e){ }

标签: java android json


【解决方案1】:

您可以JSONObject#has,提供key 作为输入并检查该方法是否返回truefalse。你也可以

使用optString 代替getString

如果存在则返回按名称映射的值,如果存在则强制 必要的。如果不存在这样的映射,则返回空字符串

【讨论】:

  • 虽然此方法可能对其他人有用,但如果值存在则不会返回。如果getString 将返回一个空字符串,optString 也将返回一个空字符串。然后假设您认为该属性在 OP 的情况下不可用。
  • @Blackbelt 你有这方面的资料吗?
【解决方案2】:

JSONObject 类有一个名为“has”的方法:

http://developer.android.com/reference/org/json/JSONObject.html#has(java.lang.String)

如果此对象具有名称映射,则返回 true。映射可能为 NULL。

【讨论】:

  • 如果密钥来自Integer类型怎么办?
  • @Eido95 将Integer 作为键听起来像是不好的做法。 JSON 应该带有一个字符串键和一个你需要的值。
  • @Eido95,我相信对于一个整数来说,总会有一个值,每次声明一个整数,都必须用一个值来初始化它。
【解决方案3】:

在读取之前检查它就像在读取之前一样

JSONObject json_obj=new JSONObject(yourjsonstr);
if(!json_obj.isNull("club"))
{
  //it's contain value to be read operation
}
else
{
  //it's not contain key club or isnull so do this operation here
}

isNull 函数定义

Returns true if this object has no mapping for name or
if it has a mapping whose value is NULL. 

isNull函数链接下方的官方文档

http://developer.android.com/reference/org/json/JSONObject.html#isNull(java.lang.String)

【讨论】:

    【解决方案4】:

    您可以通过这种方式检查 'HAS' - 如果此对象具有名称映射,则返回 true。映射可能为 NULL。

    if (json.has("status")) {
       String status = json.getString("status"));
    }
    
    if (json.has("club")) {
       String club = json.getString("club"));
    }
    

    您也可以使用 'isNull' 进行检查 - 如果此对象没有,则返回 true name 的映射,或者如果它有一个值为 NULL 的映射。

    if (!json.isNull("club"))
        String club = json.getString("club"));
    

    【讨论】:

    • 你用的是哪个json库,能否提供一个简单的json-smart或json-simple例子
    • @samuelowino json 是包含您的对象的变量
    【解决方案5】:

    试试这个

    if(!jsonObj.isNull("club")){
        jsonObj.getString("club");
    }
    

    【讨论】:

    • isNull 实际上是用于检查映射是否为空,而不是用于检查 json 成员的可用性。
    【解决方案6】:

    你可以使用has

    public boolean has(String key)
    

    确定 JSONObject 是否包含特定密钥

    示例

    JSONObject JsonObj = new JSONObject(Your_API_STRING); //JSONObject is an unordered collection of name/value pairs
    
    if (JsonObj.has("address")) { 
        //Checking address Key Present or not
        String get_address = JsonObj .getString("address"); // Present Key
    }
    else {
        //Do Your Staff
    }
    

    【讨论】:

      【解决方案7】:

      更好的方法,而不是使用类似的条件:

      if (json.has("club")) {
          String club = json.getString("club"));
       }
      

      就是简单的使用已有的方法optString(),像这样:

      String club = json.optString("club);
      

      如果键不存在,optString("key") 方法将返回一个空字符串,因此不会抛出异常。

      【讨论】:

      • 在您回答之前我不知道这存在。非常感谢。
      • 很好的答案
      【解决方案8】:
      I used hasOwnProperty('club')
      
      var myobj = { "regatta_name":"ProbaRegatta",
          "country":"Congo",
          "status":"invited"
       };
      
       if ( myobj.hasOwnProperty("club"))
           // do something with club (will be false with above data)
           var data = myobj.club;
       if ( myobj.hasOwnProperty("status"))
           // do something with the status field. (will be true with above ..)
           var data = myobj.status;
      

      适用于当前所有浏览器。

      【讨论】:

        【解决方案9】:

        我只是添加另一件事,如果您只想检查是否在 JSONObject 中创建了任何内容,您可以使用 length(),因为默认情况下,当 JSONObject 初始化并且没有键插入时,它只有空括号 {} 并且使用 has(String key) 没有任何意义。

        所以你可以直接写if (jsonObject.length() > 0)做你的事。

        学习愉快!

        【讨论】:

          【解决方案10】:

          试试这个:

          let json=yourJson
          
          if(json.hasOwnProperty(yourKey)){
              value=json[yourKey]
          }
          

          【讨论】:

            【解决方案11】:

            你可以试试这个来检查密钥是否存在:

            JSONObject object = new JSONObject(jsonfile);
            if (object.containskey("key")) {
              object.get("key");
              //etc. etc.
            }
            

            【讨论】:

              【解决方案12】:

              Json 有一个名为containsKey() 的方法。

              您可以使用它来检查某个密钥是否包含在 Json 集中。

              File jsonInputFile = new File("jsonFile.json"); 
              InputStream is = new FileInputStream(jsonInputFile);
              JsonReader reader = Json.createReader(is);
              JsonObject frameObj = reader.readObject();
              reader.close();
              
              if frameObj.containsKey("person") {
                    //Do stuff
              }
              

              【讨论】:

                【解决方案13】:

                你可以使用JsonNode#hasNonNull(String fieldName),它混合了has方法和验证是否为null值与否

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-08-19
                  相关资源
                  最近更新 更多