Comment vérifier si une clé json existe?

165

Donc, j'obtiens des valeurs JSON du serveur mais je ne sais pas s'il y aura un champ particulier ou non.

Alors comme:

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

Et parfois, il y aura un champ supplémentaire comme:

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

Je voudrais vérifier si le champ nommé "club" existe afin qu'à l'analyse, je n'obtienne pas org.json.JSONException: Aucune valeur pour club

Adam Varhegyi
la source
if (jsonObject.getString ("club")! = null) {// obtenir le val ici}
Logiciel Sainath
3
Non, à l'exception de la gestion du code, le code s'arrête et d'autres actions d'analyse ne seront pas exécutées.
Adam Varhegyi
1
@SoftwareSainath Cela ne fonctionne pas, j'ai toujours l'exception.
Adam Varhegyi
String clubvalue = ""; try (clubvalue = jsonobject.getString ("club");} catch (Exception e) {}
Software Sainath

Réponses:

267

La classe JSONObject a une méthode nommée "has":

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

Renvoie true si cet objet a un mappage pour le nom. Le mappage peut être NULL.

Développeur PX
la source
28
parce que "contient" est trop ringard? :)
Omri374
Et si la clé est de Integertype?
Eido95
2
@ Eido95 avoir Integercomme clé sonne comme une mauvaise pratique. JSON doit être avec une clé String et une valeur de tout ce dont vous avez besoin.
Nico
@ Eido95, je crois que pour un entier, il y a toujours une valeur, chaque fois que vous déclarez un entier, vous devez l'initialiser avec une valeur.
mut tony
154

Vous pouvez vérifier de cette façon où 'HAS' - Renvoie true si cet objet a un mappage pour le nom. Le mappage peut être NULL.

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

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

Vous pouvez également vérifier en utilisant 'isNull' - Renvoie true si cet objet n'a pas de mappage pour le nom ou s'il a un mappage dont la valeur est NULL.

if (!json.isNull("club"))
    String club = json.getString("club"));
Nirali
la source
1
quelle lib json utilisez-vous, pouvez-vous fournir un exemple simple pour json-smart ou json-simple
samuel owino
@samuelowino json est la variable qui contient votre objet
Fernando Torres
17

vous pouvez JSONObject#has, en fournissant keycomme entrée et vérifier si la méthode retourne trueou false. Tu pourrais aussi

utiliser à la optStringplace de getString:

Renvoie la valeur mappée par nom si elle existe, en la contraignant si nécessaire. Renvoie la chaîne vide si aucun mappage n'existe

Ceinture noire
la source
1
Bien que cette méthode de puisse être utile pour d'autres, elle ne retourne pas si la valeur existe. Si getStringaurait renvoyé une chaîne vide, optStringrenvoie également une chaîne vide. L'hypothèse vous ferait alors croire que la propriété n'est pas disponible dans la situation d'OP.
halfpastfour.am
@Blackbelt avez-vous des sources pour cela?
tsuz
11

juste avant de lire la clé, vérifiez-la comme avant de lire

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
}

Définition de la fonction isNull

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

documentation officielle ci-dessous lien pour la isNullfonction

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

Utilisateur de débordement de pile
la source
10

Vous pouvez utiliser has

public boolean has(String key)

Déterminez si le JSONObject contient une clé spécifique .

Exemple

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
la source
2

Essaye ça

if(!jsonObj.isNull("club")){
    jsonObj.getString("club");
}
R9J
la source
2
isNullest en fait pour vérifier si le mappage est nul, pas pour vérifier la disponibilité d'un membre json.
Reza_Rg
2

Une meilleure façon, au lieu d'utiliser un conditionnel comme:

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

consiste simplement à utiliser la méthode existante optString (), comme ceci:

String club = json.optString("club);

la méthode optString ("key") renverra une chaîne vide si la clé n'existe pas et ne vous lèvera donc pas d'exception.

fuzzKitty
la source
2

Json a une méthode appelée containsKey().

Vous pouvez l'utiliser pour vérifier si une certaine clé est contenue dans l'ensemble 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
la source
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;

fonctionne dans tous les navigateurs actuels.

cdturner
la source
1

Essaye ça:

let json=yourJson

if(json.hasOwnProperty(yourKey)){
    value=json[yourKey]
}
Aishwarya
la source
1

Vous pouvez essayer ceci pour vérifier si la clé existe ou non:

JSONObject object = new JSONObject(jsonfile);
if (object.containskey("key")) {
  object.get("key");
  //etc. etc.
}
Dorus Blanken
la source
0

J'ajoute juste une autre chose, au cas où vous voudriez juste vérifier si quelque chose est créé dans JSONObject ou non, vous pouvez utiliser length (), car par défaut, lorsque JSONObject est initialisé et qu'aucune clé n'est insérée, il a juste des accolades vides {}et en utilisant a (String key) n'a aucun sens.

Ainsi, vous pouvez directement écrire if (jsonObject.length() > 0)et faire vos affaires.

Bon apprentissage!

Gurinder
la source
0

Vous pouvez utiliser le JsonNode # hasNonNull (String fieldName) , il mélange la méthode has et la vérification s'il s'agit d'une valeur nulle ou non

Tiago Coelho
la source