Android Json et valeurs nulles


94

Comment puis-je détecter lorsqu'une valeur json est nulle? par exemple: [{"username": null}, {"username": "null"}]

Le premier cas représente un nom d'utilisateur inexistant et le second un utilisateur nommé "null". Mais si vous essayez de les récupérer, les deux valeurs donnent la chaîne «null»

JSONObject json = new JSONObject("{\"hello\":null}");
json.put("bye", JSONObject.NULL);
Log.e("LOG", json.toString());
Log.e("LOG", "hello="+json.getString("hello") + " is null? "
                + (json.getString("hello") == null));
Log.e("LOG", "bye="+json.getString("bye") + " is null? "
                + (json.getString("bye") == null));

La sortie du journal est

{"hello":"null","bye":null}
hello=null is null? false
bye=null is null? false

1
Contrôlez-vous le JSON? Ensuite, n'envoyez pas le champ du nom d'utilisateur et utilisez la has(java.lang.String);méthode
Blundell

2
Il s'agit d'un bogue connu et intentionnel : code.google.com/p/android/issues/detail?id=13830
Heinzi

Réponses:


220

4
J'irais plus loin et dirais de ne JAMAIS utiliser has (KEY_NAME), en remplaçant ces appels à! IsNull (KEY_NAME).
Sky Kelsey

@SkyKelsey: Pourquoi diriez-vous cela? Ce sont des choses différentes avec une sémantique différente ...
K-ballo

Vous avez raison. Ce que je voulais dire, c'est que la plupart du temps que vous utilisez has (), vous préféreriez vraiment nous! IsNull (). La plupart du temps, vous vérifiez si une valeur existe à la clé spécifiée, et cela est mieux réalisé avec! IsNull ().
Sky Kelsey

17

Étant donné que JSONObject # getString renvoie une valeur si la clé donnée existe, elle n'est pas nulle par définition. C'est la raison pour laquelle JSONObject.NULL existe: pour représenter une valeur JSON nulle.

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true

1
Merci pour votre réponse mais à mon humble avis et comme une exception JSONException est lancée si la clé n'existe pas, il est plus logique de renvoyer null lorsque l'élément est nul
Addev

Vous devrez aborder les préférences stylistiques avec les développeurs de la bibliothèque elle-même: p
FThompson

1
"nul"! = nul. Le problème est que isNull a besoin de l'api 9+ et parfois vous voulez que les apis inférieurs fonctionnent. Cette réponse est bien, vous pouvez utiliser jsonObject.getString! = "Null" pour.
sagits le

14

Pour Android, il lèvera une exception JSONException si un tel mappage n'existe pas. Vous ne pouvez donc pas appeler cette méthode directement.

json.getString("bye")

si vos données peuvent être vides (la clé peut ne pas exister), essayez

json.optString("bye","callback string");

ou

json.optString("bye");

au lieu.

Dans votre code de démonstration, le

JSONObject json = new JSONObject("{\"hello\":null}");
json.getString("hello");

ce que vous obtenez est la chaîne "null" non nulle.

votre shoud utiliser

if(json.isNull("hello")) {
    helloStr = null;
} else {
    helloStr = json.getString("hello");
}

4

Vérifiez d'abord avec isNull().... si vous ne pouvez pas travailler, essayez ci-dessous

et vous devez également JSONObject.NULLvérifier la valeur nulle ...

 if ((resultObject.has("username")
    && null != resultObject.getString("username")
    && resultObject.getString("username").trim().length() != 0)
      {
               //not null
        }

et dans votre cas, vérifiez également resultObject.getString("username").trim().eqauls("null")


Simplifié comme "if (! ResultObject.isNull (" username ") && resultObject.getString (" username "). Trim (). Length ()! = 0)"
Sky Kelsey

3

Si vous devez d'abord analyser json et gérer l'objet plus tard, essayez ceci

Analyseur

Object data = json.get("username");

Gestionnaire

if (data instanceof Integer || data instanceof Double || data instanceof Long) {
     // handle number ;
} else if (data instanceof String) {
     // hanle string;               
} else if (data == JSONObject.NULL) {
     // hanle null;                 
}

2

Voici une méthode d'assistance que j'utilise pour obtenir des chaînes JSON avec une seule ligne de code:

public String getJsonString(JSONObject jso, String field) {
    if(jso.isNull(field))
        return null;
    else
        try {
            return jso.getString(field);
        }
        catch(Exception ex) {
            LogHelper.e("model", "Error parsing value");
            return null;
        }
}

et puis quelque chose comme ça:

String mFirstName = getJsonString(jsonObject, "first_name");

vous donnerait la valeur de votre chaîne ou définirait en toute sécurité votre variable de chaîne sur null. J'utilise Gson chaque fois que je peux pour éviter de tels pièges. Il gère beaucoup mieux les valeurs nulles à mon avis.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.