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

Adam Varhegyi
źródło
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.

PX Developer
źródło
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"));
Nirali
źródło
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

Czarny pas
źródło
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
}
IntelliJ Amiya
źródło
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)

Użytkownik przepełnienia stosu
źródło
2

Spróbuj tego

if(!jsonObj.isNull("club")){
    jsonObj.getString("club");
}
R9J
źródło
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.

fuzzKitty
źródło
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
}
Udana Methmal
źródło
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.

cdturner
źródło
1

Spróbuj tego:

let json=yourJson

if(json.hasOwnProperty(yourKey)){
    value=json[yourKey]
}
Aishwarya
źródło
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.
}
Dorus Blanken
źródło
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!

Gurinder
źródło
0

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

Tiago Coelho
źródło