Как проверить, существует ли ключ 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.

PX Developer
источник
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"));
Nirali
источник
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
}
IntelliJ Amiya
источник
2

Попробуй это

if(!jsonObj.isNull("club")){
    jsonObj.getString("club");
}
R9J
источник
2
isNullна самом деле для проверки, является ли отображение пустым, а не для проверки доступности члена json.
Reza_Rg
2

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

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

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

String club = json.optString("club);

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

fuzzKitty
источник
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;

работает во всех текущих браузерах.

cdturner
источник
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 или вы не можете использовать длину (), так как по умолчанию при JSONObject инициализации и ключ не вставлен, он просто имеет пустые скобки {}и использование имеет (Строковый ключ) не имеет никакого смысла.

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

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

Gurinder
источник
0

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

Тиаго Коэльо
источник