Як перевірити, чи існує ключ json?


165

Отже, я отримую деякі значення JSON від сервера, але я не знаю, буде якесь поле чи ні.

Так, як:

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

І іноді з’явиться додаткове поле типу:

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

Я хотів би перевірити, чи існує поле під назвою "club", щоб при розборі я не отримав org.json.JSONException: Немає значення для клубу


if (jsonObject.getString ("club")! = null) {// дістати сюди доріг}
Software Sainath

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

1
@SoftwareSainath Thats не працює, все ж отримав виняток.
Адам Варгегій

Рядок clubvalue = ""; спробуйте (clubvalue = jsonobject.getString ("club");} улов (виняток e) {}
програмне забезпечення Sainath

Відповіді:


266

Клас JSONObject має метод, який називається "має":

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

Повертає істину, якщо цей об'єкт має відображення імені. Відображення може бути NULL.


28
тому що "містить" занадто банально? :)
Omri374

Що робити, якщо ключ від Integerтипу?
Eido95

2
@ Eido95, що є Integerключовим, звучить як погана практика. JSON має бути з ключем String і значенням того, що вам потрібно.
Ніко

@ Eido95, я вважаю, що для цілого числа завжди є значення, кожен раз, коли ви оголошуєте ціле число, ви повинні ініціалізувати його зі значенням.
мут тоні

154

Ви можете перевірити таким чином, де "HAS" - Повертає істину, якщо цей об'єкт має відображення імені. Відображення може бути NULL.

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

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

Ви також можете перевірити, використовуючи 'isNull' - Повертає істину, якщо для цього об’єкта немає відображення імені або якщо він має відображення, значення якого 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також поверне порожню рядок. Тоді ви припускаєте, що ви вважаєте, що майно недоступне в ситуації з ОП.
halfpastfour.am

@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
}

визначенняNull функції

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насправді для перевірки, чи відображення недійсне, а не для перевірки наявності члена json.
Reza_Rg

2

Кращий спосіб замість використання умовного типу:

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

просто використовувати існуючий метод optString (), наприклад:

String club = json.optString("club);

метод optString ("ключ") поверне порожню рядок, якщо ключ не існує і не буде, тому викине вам виняток.


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

Ви можете спробувати це перевірити, існує ключ чи немає:

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.