Jak sprawdzić, czy istnieje klucz JSON?


165

Tak więc otrzymuję wartości JSON z serwera, ale nie wiem, czy będzie określone pole, czy nie.

Więc jak:

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

Czasami pojawi się dodatkowe pole, takie jak:

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

Chciałbym sprawdzić, czy pole o nazwie „club” istnieje, aby podczas analizowania nie uzyskać org.json.JSONException: Brak wartości dla club


if (jsonObject.getString ("club")! = null) {// pobierz tutaj dolinę}
Software Sainath,

3
Nie, w przypadku wyjątku obsługa kodu zatrzymuje się, a dalsze działania analizujące nie zostaną uruchomione.
Adam Varhegyi,

1
@SoftwareSainath To nie działa, nadal mam wyjątek.
Adam Varhegyi,

String clubvalue = ""; try (clubvalue = jsonobject.getString ("club");} catch (Exception e) {}
Software Sainath,

Odpowiedzi:


266

Klasa JSONObject ma metodę o nazwie „has”:

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

Zwraca wartość true, jeśli ten obiekt ma odwzorowanie nazwy. Mapowanie może mieć wartość NULL.


28
ponieważ „zawiera” jest zbyt banalne? :)
Omri374

A jeśli klucz jest Integertypu?
Eido95

2
@ Eido95 posiadanie Integerklucza jako klucza brzmi jak zła praktyka. JSON powinien zawierać klucz String i wartość tego, czego potrzebujesz.
Nico

@ Eido95, wierzę, że dla liczby całkowitej zawsze jest wartość, za każdym razem, gdy deklarujesz liczbę całkowitą, musisz zainicjować ją wartością.
mut tony

154

Możesz sprawdzić w ten sposób, gdzie „HAS” - zwraca wartość true, jeśli ten obiekt ma odwzorowanie nazwy. Mapowanie może mieć wartość NULL.

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

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

Możesz również sprawdzić za pomocą „isNull” - zwraca wartość true, jeśli ten obiekt nie ma odwzorowania nazwy lub ma odwzorowanie o wartości NULL.

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

1
której biblioteki json używasz, czy możesz podać prosty przykład dla json-smart lub json-simple
samuel owino.

@samuelowino json to zmienna, która zawiera twój obiekt
Fernando Torres

17

możesz JSONObject#has, podając keyjako dane wejściowe i sprawdź, czy metoda zwraca truelub false. Ty też możesz

użyj optStringzamiast getString:

Zwraca wartość zamapowaną według nazwy, jeśli istnieje, i w razie potrzeby ją wymusza. Zwraca pusty ciąg, jeśli nie istnieje takie mapowanie


1
Chociaż ta metoda może być przydatna dla innych, to nie zwraca, jeśli wartość istnieje. Jeśli getStringzwróciłby pusty ciąg, optStringzwróciłby również pusty ciąg. Założenie sprawiłoby, że uważasz, że nieruchomość nie jest dostępna w sytuacji OP.
halfpastfour.am

@Blackbelt czy masz źródła tego?
tsuz

10

Możesz użyć has

public boolean has(String key)

Sprawdź, czy obiekt JSONObject zawiera określony klucz .

Przykład

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

tuż przed odczytaniem klucza sprawdź jak przed przeczytaniem

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
}

Definicja funkcji isNull

Returns true if this object has no mapping for name or
if it has a mapping whose value is NULL. 

Oficjalna dokumentacja poniżej linku do isNullfunkcji

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


2

Spróbuj tego

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

2
isNullw rzeczywistości służy do sprawdzenia, czy mapowanie jest zerowe, a nie do sprawdzania dostępności elementu json.
Reza_Rg

2

Lepszy sposób, zamiast używać warunku takiego jak:

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

polega po prostu na użyciu istniejącej metody optString (), na przykład:

String club = json.optString("club);

metoda optString ("key") zwróci pusty ciąg, jeśli klucz nie istnieje i dlatego nie zgłosi wyjątku.


2

Json ma metodę o nazwie containsKey().

Możesz go użyć do sprawdzenia, czy określony klucz znajduje się w zestawie 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;

działa we wszystkich obecnych przeglądarkach.


1

Spróbuj tego:

let json=yourJson

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

1

Możesz spróbować tego, aby sprawdzić, czy klucz istnieje, czy nie:

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

0

Dodam tylko kolejną rzecz, jeśli chcesz tylko sprawdzić, czy coś jest utworzone w JSONObject, czy nie, możesz użyć length (), ponieważ domyślnie, gdy JSONObject jest zainicjowany i nie jest wstawiony żaden klucz, ma po prostu puste nawiasy {}i użycie ma (Klawisz String) nie ma sensu.

Możesz więc bezpośrednio pisać if (jsonObject.length() > 0)i robić swoje rzeczy.

Miłej nauki!


0

Możesz użyć JsonNode # hasNonNull (String fieldName) , łączy metodę has i weryfikację, czy jest to wartość null, czy nie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.