Android Json y valores nulos

94

¿Cómo puedo detectar cuando un valor json es nulo? por ejemplo: [{"username": null}, {"username": "null"}]

El primer caso representa un nombre de usuario inexistente y el segundo un usuario llamado "nulo". Pero si intenta recuperarlos, ambos valores dan como resultado la cadena "nulo"

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 salida del registro es

{"hello":"null","bye":null}
hello=null is null? false
bye=null is null? false
Addev
fuente
1
¿Controlas el JSON? Entonces no envíe el campo de nombre de usuario y use el has(java.lang.String);método
Blundell
2
Este es un error conocido e intencional : code.google.com/p/android/issues/detail?id=13830
Heinzi

Respuestas:

220

Prueba con json.isNull( "field-name" ).

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

K-Ballo
fuente
4
Iría más allá y diría que NUNCA use has (KEY_NAME), reemplazando esas llamadas a! IsNull (KEY_NAME).
Sky Kelsey
@SkyKelsey: ¿Por qué dirías eso? Esas son cosas diferentes con una semántica diferente ...
K-ballo
Tienes razón. Lo que quise decir es que la mayor parte del tiempo que usas has (), ¡realmente preferirías que nosotros! IsNull (). La mayoría de las veces está comprobando si existe un valor en la clave especificada, y eso se logra mejor con! IsNull ().
Sky Kelsey
17

Debido a que JSONObject # getString devuelve un valor si la clave dada existe, no es nulo por definición. Esta es la razón por la que existe JSONObject.NULL: para representar un valor JSON nulo.

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true
FThompson
fuente
1
Gracias por su respuesta, pero en mi humilde opinión, y dado que se lanza una JSONException si la clave no existe, es más lógico devolver nulo cuando el elemento es nulo
Addev
Deberá
hablar
1
"nulo"! = nulo. El problema es que isNull necesita api 9+ y, a veces, quieres que funcionen apis inferiores. Esta respuesta es buena, puede usar jsonObject.getString! = "Null" para.
sagits
14

Para Android, generará una JSONException si no existe tal asignación. Entonces no puede llamar a este método directamente.

json.getString("bye")

si sus datos pueden estar vacíos (puede que no exista la clave), intente

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

o

json.optString("bye");

en lugar.

En su código de demostración, el

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

esto se obtiene es String "nulo" no nulo.

tu deberías usar

if(json.isNull("hello")) {
    helloStr = null;
} else {
    helloStr = json.getString("hello");
}
tímidamente
fuente
4

primero verifique con isNull().... si no puede funcionar, intente a continuación

y también tienes JSONObject.NULLque comprobar el valor nulo ...

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

y en tu caso también revisa resultObject.getString("username").trim().eqauls("null")

Samir Mangroliya
fuente
Simplificado como "if (! ResultObject.isNull (" username ") && resultObject.getString (" username "). Trim (). Length ()! = 0)"
Sky Kelsey
3

Si debe analizar json primero y manejar el objeto más tarde, intente esto

Analizador

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

Manipulador

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
fuente
2

Aquí hay un método auxiliar que utilizo para poder obtener cadenas JSON con solo una línea de código:

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

y luego algo como esto:

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

le daría su valor de cadena o establecería de manera segura su variable de cadena en nulo. Utilizo Gson siempre que puedo para evitar errores como estos. Maneja valores nulos mucho mejor en mi opinión.

Lou Morda
fuente