JSON jsonObject.optString () devuelve String "null"

Estoy desarrollando una aplicación de Android que utiliza JSON para la comunicación del servidor y tengo un problema extraño cuando estoy tratando de analizar mi archivo json.

Este es mi json desde el servidor

{ "street2": null, "province": null, "street1": null, "postalCode": null, "country": null, "city": null } 

Estoy obteniendo el valor de City llamando a String city = address.optString("city", "") en mi dirección Json-object. Para esta situación estoy esperando que la city esté vacía (eso es lo que optString está aquí para no?), Pero de hecho contiene la cadena "null". Por lo tanto, más nulo o isEmpty-checks devolverá false ya que la cadena contiene texto. Si llamo a address.isNull("city") devuelve verdadero que es correcto. Sólo optString falla.

No pude encontrar nada en Google o Stackoverflow para este problema. Realmente no entiendo cómo puede suceder como pensé optString haría exactamente lo que esperaba. ¿Alguien sabe lo que está mal aquí?

Usted no está solo en la ejecución en este problema y rascarse la cabeza, pensando "¿Podrían realmente han significado esto?" Según un problema de AOSP, los ingenieros de Google consideraron esto un error , pero tenían que ser compatibles con la implementación org.json, incluso compatible con los errores.

Si lo piensas, tiene sentido, porque si el mismo código que utiliza las mismas librerías que se ejecutan en otros entornos Java se comporta de manera diferente en Android, habrá grandes problemas de compatibilidad al utilizar bibliotecas de terceros. Incluso si las intenciones fueran buenas y realmente arreglaran bichos, abriría una nueva lata de gusanos.

Según la edición de AOSP :

El comportamiento es intencional; Nos fuimos fuera de nuestro camino para ser compatible con el error org.json. Ahora que eso está arreglado, no está claro si deberíamos arreglar nuestro código también. Las aplicaciones pueden haber llegado a confiar en este comportamiento buggy.

Si esto le está causando pena, le recomiendo la solución alternativa utilizando un mecanismo diferente para probar para null, como json.isNull ().

Aquí está un método simple para ayudarle hacia fuera:

 /** Return the value mapped by the given key, or {@code null} if not present or null. */ public static String optString(JSONObject json, String key) { // http://code.google.com/p/android/issues/detail?id=13830 if (json.isNull(key)) return null; else return json.optString(key, null); } 

Usted tiene básicamente 2 opciones:

1) Enviar una carga JSON con valores nulos

 { "street2": "s2", "province": "p1", "street1": null, "postalCode": null, "country": null, "city": null } 

Tendrá que comprobar si hay valores nulos y analizarlos en consecuencia:

 private String optString_1(final JSONObject json, final String key) { return json.isNull(key) ? null : json.optString(key); } 

2) No envíe las claves con valores nulos y use optString (clave, null) directamente (debería ahorrarle ancho de banda).

 { "street2": "s2", "province": "p1" } 
 if (json != null && json.getString(KEY_SUCCESS) != null){ // PARSE RESULT }else{ // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE 

}

Que es para comprobar json null con la palabra clave.

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

Esto se obtiene es String "null" no nulo.

Tu deberías usar

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

Primero verifique con isNull () …. si no puede trabajar intente entonces belows

Y también tiene JSONObject.NULL para comprobar el valor nulo …

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

Y en su caso también revise

 resultObject.getString("username").trim().eqauls("null") 

Si primero debe analizar json y manejar el objeto más adelante, deje que pruebe esto

Analizador

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

Entrenador de animales

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

Si los valores para la clave son nulos como a continuación

{

"Estado": 200,

"Mensaje": "",

"Datos": {

 "totalFare": null, 

},

}

Verifique con "isNull", por ejemplo:

String strTotalFare;

If (objResponse.isNull ("totalFare"))

{

StrTotalFare = "0";

} Else {

StrTotalFare = objResponse.getString ("totalFare");

}

Si el valor es "nulo" para la clave "totalFare", la función anterior entrará en si y asigna el valor cero, sino que obtendrá el valor real de la clave.

Utilizando la respuesta de Matt Quigley como base, aquí está el código si desea imitar la funcionalidad completa de optString, incluyendo la parte de fallback, escrita en Kotlin y Java.

Kotlin:

 fun optString(json: JSONObject, key: String, fallback: String?): String? { var stringToReturn = fallback if (!json.isNull(key)) { stringToReturn = json.optString(key, null) } return stringToReturn } 

Java:

 public static String optString(JSONObject json, String key, String fallback) { String stringToReturn = fallback; if (!json.isNull(key)) { stringToReturn = json.optString(key, null); } return stringToReturn; } 

Simplemente pase en null el parámetro de fallback si no necesita el fallback.

  • ¿Cómo se puede pasar JSON a AngularJS en la vista web de Android?
  • Optimizar JSonArray para Loop
  • Conversión de cadena a json objeto android
  • GSON. Cómo convertir json objeto a json array?
  • JsonSubTypes, lista de objetos polimórficos y Parcelable
  • Servidor ByetHost que pasa valores html "Comprobación de su navegador" con JSON String
  • Gson Array de deserialización de matrices
  • Org.codehaus.jackson.JsonParseException: carácter inesperado ('' (código 65279 / 0xfeff)): se espera un valor válido
  • El valor del tipo org.json.JSONArray no se puede convertir en JSONObject
  • Analizando JSON en Java
  • Crear un JSONArray
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.