Json Android e valori null


94

Come posso rilevare quando un valore json è nullo? ad esempio: [{"username": null}, {"username": "null"}]

Il primo caso rappresenta un nome utente inesistente e il secondo un utente denominato "null". Ma se provi a recuperarli entrambi i valori risultano nella stringa "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));

L'output del registro è

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

1
Controlli il JSON? Quindi non inviare il campo del nome utente e utilizzare il has(java.lang.String);metodo
Blundell

2
Questo è un bug noto e intenzionale : code.google.com/p/android/issues/detail?id=13830
Heinzi

Risposte:


220

4
Vorrei andare oltre e dire di non usare MAI has (KEY_NAME), sostituendo quelle chiamate a! IsNull (KEY_NAME).
Sky Kelsey

@SkyKelsey: Perché lo dici? Sono cose diverse con semantica diversa ...
K-ballo

Hai ragione. Quello che volevo dire era che la maggior parte delle volte che usi has (), preferiresti davvero noi! IsNull (). La maggior parte delle volte stai controllando se esiste un valore nella chiave specificata, e questo è meglio ottenuto con! IsNull ().
Sky Kelsey

17

Poiché JSONObject # getString restituisce un valore se la chiave specificata esiste, non è nullo per definizione. Questo è il motivo per cui JSONObject.NULL esiste: per rappresentare un valore JSON nullo.

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

1
Grazie per la tua risposta ma imho e poiché viene generata un'eccezione JSONException se la chiave non esiste è più logico restituire null quando l'elemento è null
Addev

Avrai bisogno di prendere le preferenze stilistiche con gli sviluppatori della libreria stessa: p
FThompson

1
"null"! = null. Il problema è che isNull necessita di api 9+ e talvolta desideri che le API inferiori funzionino. Questa risposta è buona, puoi usare jsonObject.getString! = "Null" a.
sagits

14

Per Android solleverà un'eccezione JSONException se non esiste una tale mappatura. Quindi non puoi chiamare direttamente questo metodo.

json.getString("bye")

se i tuoi dati possono essere vuoti (potrebbe non esistere la chiave), prova

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

o

json.optString("bye");

anziché.

Nel tuo codice demo, il file

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

questo che ottieni è String "null" non null.

il tuo uso dovrebbe

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

4

prima controlla con isNull().... se non riesco a funzionare, prova con il belows

e inoltre devi JSONObject.NULLcontrollare il valore nullo ...

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

e nel tuo caso controlla anche resultObject.getString("username").trim().eqauls("null")


Semplificato come "if (! ResultObject.isNull (" username ") && resultObject.getString (" username "). Trim (). Length ()! = 0)"
Sky Kelsey

3

Se devi prima analizzare json e gestire l'oggetto in un secondo momento, prova questo

Parser

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

Gestore

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

Ecco un metodo di supporto che utilizzo in modo da poter ottenere stringhe JSON con una sola riga di codice:

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;
        }
}

e poi qualcosa del genere:

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

ti darebbe il tuo valore di stringa o imposterebbe in modo sicuro la tua variabile di stringa su null. Uso Gson ogni volta che posso per evitare insidie ​​come queste. Gestisce i valori nulli molto meglio secondo me.

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.