Как проверить, существует ли ключ 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) {// получить вейл здесь}
программное обеспечение Sainath

3
Нет, при обработке исключений код останавливается, и дальнейшие действия разбора не запускаются.
Адам Вархеги

1
@SoftwareSainath Это не работает, все еще получил исключение.
Адам Вархеги

String clubvalue = ""; try (clubvalue = jsonobject.getString ("club");} catch (Exception e) {}
программное обеспечение Sainath

Ответы:


267

У класса JSONObject есть метод с именем "has":

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

Возвращает true, если у этого объекта есть сопоставление имени. Отображение может быть NULL.


28
потому что "содержит" слишком банально? :)
Omri374

Что делать, если ключ от Integerтипа?
Eido95

2
@ Eido95 Integerв качестве ключа звучит как плохая практика. JSON должен быть с ключом String и значением того, что вам нужно.
Нико

@ Eido95, я считаю, что для целого числа всегда есть значение, каждый раз, когда вы объявляете целое число, вы должны инициализировать его значением.
мут Тони

154

Вы можете проверить этот путь, где 'HAS' - возвращает 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"));

1
какой json lib вы используете, можете ли вы привести простой пример для json-smart или json-simple
samuel owino

@samuelowino json - переменная, которая содержит ваш объект
Фернандо Торрес

17

Вы можете JSONObject#has, предоставив keyвходные данные как и проверить, возвращает ли метод trueили false. Вы могли бы также

используйте optStringвместо getString:

Возвращает значение, отображаемое по имени, если оно существует, и при необходимости вызывает его. Возвращает пустую строку, если такого отображения не существует


1
Хотя этот метод может быть полезен для других, он не возвращается, если значение существует. Если getStringбы вернул пустую строку, optStringтакже вернул бы пустую строку. Предположение тогда заставит вас поверить, что собственность не доступна в ситуации OP.
halfpastfour.am

@ Blackbelt у тебя есть источники для этого?
Цуз

11

как раз перед прочтением ключа проверьте его как перед прочтением

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
}

2

Попробуй это

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

2
isNullна самом деле для проверки, является ли отображение пустым, а не для проверки доступности члена json.
Reza_Rg

2

Лучший способ, вместо использования условного типа:

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

это просто использовать существующий метод optString (), например:

String club = json.optString("club);

метод optString ("key") вернет пустую строку, если ключ не существует и, следовательно, не выдаст вам исключение.


2

У Джсона есть метод, который называется 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

Вы можете попробовать это проверить, существует ли ключ или нет:

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

0

Я просто добавив еще одну вещь, в случае , если вы просто хотите проверить, создается ли что - нибудь в JSONObject или вы не можете использовать длину (), так как по умолчанию при JSONObject инициализации и ключ не вставлен, он просто имеет пустые скобки {}и использование имеет (Строковый ключ) не имеет никакого смысла.

Таким образом, вы можете напрямую писать if (jsonObject.length() > 0)и делать свои вещи.

Счастливого обучения!


0

Вы можете использовать JsonNode # hasNonNull (String fieldName) , он смешивает метод has и проверку, если это нулевое значение или нет

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.