Come verificare se esiste una chiave json?


165

Quindi, ottengo alcuni valori JSON dal server ma non so se ci sarà un campo particolare o meno.

Quindi come:

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

E a volte, ci sarà un campo in più come:

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

Vorrei verificare se il campo denominato "club" esiste in modo che al momento dell'analisi non ottenga org.json.JSONException: nessun valore per il club


if (jsonObject.getString ("club")! = null) {// trova qui il valore}
Software Sainath,

3
No, ad eccezione della gestione del codice si arresta e non verranno eseguite ulteriori azioni di analisi.
Adam Varhegyi,

1
@SoftwareSainath Non funziona, ha ancora l'eccezione.
Adam Varhegyi,

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

Risposte:


266

La classe JSONObject ha un metodo chiamato "has":

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

Restituisce vero se questo oggetto ha una mappatura per nome. Il mapping può essere NULL.


28
perché "contiene" è troppo banale? :)
Omri374,

Cosa succede se la chiave proviene dal Integertipo?
Eido95,

2
@ Eido95 che ha Integercome chiave sembra una cattiva pratica. JSON dovrebbe essere con una chiave String e un valore di qualsiasi cosa tu abbia bisogno.
Nico,

@ Eido95, credo che per un numero intero ci sia sempre un valore, ogni volta che dichiari un numero intero, devi inizializzarlo con un valore.
mut tony

154

Puoi controllare in questo modo dove 'HA' - Restituisce vero se questo oggetto ha una mappatura per nome. Il mapping può essere NULL.

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

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

Puoi anche verificare usando 'isNull' - Restituisce vero se questo oggetto non ha mappatura per nome o se ha una mappatura il cui valore è NULL.

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

1
quale json lib stai usando, puoi fornire un semplice esempio per json-smart o json-simple
samuel owino,

@samuelowino json è la variabile che contiene il tuo oggetto
Fernando Torres

17

è possibile JSONObject#has, fornendo keycome input e verificare se il metodo restituisce trueo false. Potresti anche

utilizzare optStringinvece di getString:

Restituisce il valore mappato per nome se esiste, forzandolo se necessario. Restituisce la stringa vuota se non esiste tale mapping


1
Sebbene questo metodo di possa essere utile per altri, questo non restituisce se il valore esiste. Se getStringavrebbe restituito una stringa vuota, optStringrestituirebbe anche una stringa vuota. Il presupposto quindi ti farebbe credere che la proprietà non è disponibile nella situazione di OP.
halfpastfour.am,

@Blackbelt hai fonti per questo?
Tsuz,

10

Puoi usare has

public boolean has(String key)

Determina se JSONObject contiene una chiave specifica .

Esempio

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

appena prima di leggere il tasto controlla come prima di leggere

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
}

Definizione della funzione isNull

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

documentazione ufficiale sotto il link per la isNullfunzione

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


2

Prova questo

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

2
isNullserve effettivamente per verificare se la mappatura è nulla, non per verificare la disponibilità di un membro json.
Reza_Rg

2

Un modo migliore, invece di utilizzare un condizionale come:

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

è semplicemente usare il metodo esistente optString (), in questo modo:

String club = json.optString("club);

il metodo optString ("chiave") restituirà una stringa vuota se la chiave non esiste e pertanto non genererà un'eccezione.


2

Json ha un metodo chiamato containsKey().

Puoi usarlo per verificare se una determinata chiave è contenuta nel set 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;

funziona in tutti i browser attuali.


1

Prova questo:

let json=yourJson

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

1

Puoi provare questo per verificare se la chiave esiste o no:

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

0

Sto semplicemente aggiungendo un'altra cosa, Nel caso in cui si vuole solo controllare se nulla si crea in JSONObject o non è possibile utilizzare la lunghezza (), perché per impostazione predefinita quando JSONObject viene inizializzato e viene inserito alcun tasto, ha solo bretelle vuote {}e l'utilizzo ha (Chiave stringa) non ha alcun senso.

Quindi puoi scrivere if (jsonObject.length() > 0)e fare direttamente le tue cose.

Buon apprendimento!


0

È possibile utilizzare JsonNode # hasNonNull (String fieldName) , mescola il metodo has e la verifica se è un valore null o no

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.