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

Essayez avec json.isNull( "field-name" ).

Référence: http://developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29

K-ballo
la source
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
FThompson
la source
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");
}
timidement
la source
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")

Samir Mangroliya
la source
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;                 
}
thanhbinh84
la source
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.

Lou Morda
la source