如何检查json键是否存在?


165

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

像这样:

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

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

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

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


if(jsonObject.getString(“ club”)!= null){//在这里获得价值}
Software Sainath

3
不,在例外情况下,代码停止运行,并且不会运行进一步的解析操作。
亚当·瓦赫吉

1
@SoftwareSainath那是行不通的,仍然有异常。
Adam Varhegyi 2013年

String clubvalue =“”; try(clubvalue = jsonobject.getString(“ club”);} catch(Exception e){}
软件Sainath 2013年

Answers:


266

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

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

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


28
因为“包含”太老套?:)
Omri374 '16

如果密钥来自Integer类型怎么办?
Eido95 '17

2
@ Eido95将a Integer作为键听起来像是不好的做法。JSON应该带有String键,并且其值可以是您需要的任何值。
Nico

@ Eido95,我相信对于整数总是有一个值,每次声明一个整数时,都必须使用一个值对其进行初始化。
mut tony

154

您可以在“ 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"));

1
您使用哪个json库,能否提供json-smart或json-simple的简单示例
samuel owino

@samuelowino json是包含您的对象的变量
费尔南多·托雷斯

17

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

使用optString代替getString

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


1
尽管此方法可能对其他方法有用,但如果值存在,则此方法不会返回。如果getString将返回一个空字符串,则optString还将返回一个空字符串。然后假设您认为该属性在OP的情况下不可用。
halfpastfour.am 2014年

@Blackbelt您是否有相关资源?
tsuz

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
}

10

就在读键之前,像读之前一样检查它

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)


2

试试这个

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

2
isNull实际上是用于检查映射是否为null,而不是用于检查json成员的可用性。
Reza_Rg 2015年

2

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

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

就是简单地使用现有方法optString(),如下所示:

String club = json.optString("club);

如果该键不存在并且不会引发异常,则optString(“ key”)方法将返回一个空String。


2

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
}

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

试试这个:

let json=yourJson

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

1

您可以尝试使用此命令检查密钥是否存在:

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

0

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

这样您就可以直接编写if (jsonObject.length() > 0)并执行您的操作。

学习愉快!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.