如何检查json密钥是否存在?

时间:2013-07-05 10:54:38

标签: java android json

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

所以喜欢:

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

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

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

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

13 个答案:

答案 0 :(得分:227)

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

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

  

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

答案 1 :(得分:133)

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

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

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

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

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

答案 2 :(得分:14)

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

使用optString代替getString

  

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

答案 3 :(得分:9)

您可以使用public boolean has(String 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
}

确定 JSONObject 是否包含 特定密钥

示例

<!doctype html>
<html>
    <head>
        <title>Google maps - multiple markers example</title>

        <script type='text/javascript'>
            /* data, derived from a db call and written as a json object */
            var json={
                "results":{
                    "0":{"name":"Kinnettles","lat":"56.61543329027024","lng":"-2.9266123065796137"},
                    "1":{"name":"Nathro","lat":"56.793249595719956","lng":"-2.8623101711273193"},
                    "2":{"name":"Ark Hill","lat":"56.57065514278748","lng":"-3.0511732892761074"},
                    "3":{"name":"Dodd Hill","lat":"56.54251020079966","lng":"-2.9051538305053555"},
                    "4":{"name":"Govals","lat":"56.582320876071854","lng":"-2.9509015874633633"},
                    "5":{"name":"Carsegownie","lat":"56.67951330362271","lng":"-2.8062983350524746"},
                    "6":{"name":"Frawney","lat":"56.56806620951482","lng":"-2.9501720266113125"},
                    "7":{"name":"North Tarbrax","lat":"56.57144715546598","lng":"-2.92476614282225"},
                    "8":{"name":"The Carrach","lat":"56.6938437674986","lng":"-3.131382067657455"},
                    "9":{"name":"Glaxo","lat":"56.70431711148748","lng":"-2.4660869436035"}
                }
            };

            /* callback function */
            function initialise(){

                var bounds = new google.maps.LatLngBounds();
                var infoWindow = new google.maps.InfoWindow();

                var map = new google.maps.Map( document.getElementById('map'), {
                    zoom:10,
                    center: { lat: 56.6154, lng: -2.9266 }
                });

                /* process json data and add a marker for each location */
                var data=json.results;
                for( var o in data ){

                    var latlng=new google.maps.LatLng( data[o].lat, data[o].lng );
                    var title=data[o].name;

                    var marker = new google.maps.Marker({
                      position: latlng,
                      map: map,
                      title: title,
                      content:title
                    });

                    google.maps.event.addListener(marker, 'click', function(event){
                        infoWindow.setContent( this.content );
                        infoWindow.open(map, this);
                    }.bind(marker));

                    bounds.extend( latlng );
                }
                map.fitBounds(bounds);
            }
        </script>
        <script async defer src='//maps.googleapis.com/maps/api/js?key=AIzaSyA157quXbUlHHgm4wJJxzD49MivKgPSil8&callback=initialise' type='text/javascript'></script>
        <style type='text/css'>
            html, body {
                height: 100%;
                margin: 0;
                padding: 0;
            }
            #map{
                display:block;
                box-sizing:border-box;
                width:800px;
                height:600px;
                margin:1rem auto;
                float:none;
                border:3px solid black;
            }
        </style>
    </head>
    <body>
        <div id='map'></div>
    </body>
</html>

答案 4 :(得分:6)

在读取密钥之前,请在阅读之前检查它

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)

答案 5 :(得分:2)

试试这个

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

答案 6 :(得分:2)

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

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

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

String club = json.optString("club);

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

答案 7 :(得分: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;

适用于所有当前浏览器。

答案 8 :(得分:1)

尝试一下:

let json=yourJson

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

答案 9 :(得分:0)

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

因此您可以直接写if (jsonObject.length() > 0)来做您的事情。

学习愉快!

答案 10 :(得分:0)

您可以尝试检查密钥是否存在:

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

答案 11 :(得分:0)

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
}

答案 12 :(得分:0)

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