如何检查JSON中是否存在键?

218

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

就像这样:

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

有时会出现额外的字段,例如:

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

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

org.json.JSONException: No value for club


如果(jsonObject.getString("club")!=null){ //在这里获取值 } - Software Sainath
3
不,在异常处理中,代码会停止运行,并且后续的解析操作将不会执行。 - Adam Varhegyi
1
@SoftwareSainath 这并不起作用,仍然会出现异常。 - Adam Varhegyi
字符串 clubvalue="";尝试{clubvalue=jsonobject.getString("club");}捕获(Exception e){ } - Software Sainath
13个回答

339

如果键是 Integer 类型怎么办? - Eido95
2
@Eido95 用 Integer 作为键似乎是不好的做法。JSON 应该使用字符串键和您需要的任何值。 - Nico
@Eido95,我相信对于一个整数来说总是有一个值的,每次声明一个整数时,你都必须用一个值来初始化它。 - mut tony

182

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

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

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

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

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

3
你使用的是哪个 JSON 库?能否提供一个关于 json-smart 或者 json-simple 的简单示例? - Samuel Owino
@samuelowino,json是包含您对象的变量。 - Fernando Torres

19
你可以使用JSONObject#has方法,将key作为输入,并检查该方法是否返回truefalse。你也可以使用optString而不是getString

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


1
尽管这种方法可能对其他人有用,但它并不返回值是否存在。如果getString返回一个空字符串,optString也会返回一个空字符串。这样假设该属性在OP的情况下不可用。 - halfpastfour.am
@Blackbelt,你有这方面的资料来源吗? - Taku

18

在读取密钥之前,像以前一样进行检查

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)


10
你可以使用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);

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


直到看到你的回答,我才知道这个存在。非常感谢! - DevOpsSauce
非常好的答案 - Islam Alshnawey

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
}

3

试试这个:

let json=yourJson

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

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;

适用于所有现代浏览器。


1

试试这个

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

3
isNull 实际上是用来检查映射是否为 NULL,而不是用于检查 JSON 成员的可用性。 - Reza_Rg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接