201

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

就像:

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

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

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

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

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

4

13 回答 13

323

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

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

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

于 2013-07-05T10:57:31.733 回答
170

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

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

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

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

if (!json.isNull("club"))
    String club = json.getString("club"));
于 2013-07-05T11:07:53.770 回答
18

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

使用optString而不是getString

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

于 2013-07-05T10:56:01.227 回答
16

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

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)

于 2013-07-05T10:59:56.153 回答
10

您可以使用has

public boolean has(String key)

确定JSONObject是否包含特定的 key

例子

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
}
于 2016-07-23T08:41:32.513 回答
7

更好的方法,而不是使用像这样的条件:

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

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

String club = json.optString("club);

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

于 2017-11-22T23:34:14.740 回答
3

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
}
于 2019-09-24T13:17:50.180 回答
2

尝试这个:

let json=yourJson

if(json.hasOwnProperty(yourKey)){
    value=json[yourKey]
}
于 2019-08-07T13:27:59.780 回答
1

尝试这个

if(!jsonObj.isNull("club")){
    jsonObj.getString("club");
}
于 2013-07-05T11:10:45.430 回答
1
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;

适用于所有当前浏览器。

于 2018-05-19T02:59:45.273 回答
1

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

JSONObject object = new JSONObject(jsonfile);
if (object.containskey("key")) {
  object.get("key");
  //etc. etc.
}
于 2019-08-24T21:05:08.240 回答
0

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

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

快乐学习!

于 2018-08-06T14:07:43.800 回答
0

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

于 2020-06-08T15:29:00.420 回答