¿Cómo verificar si existe una clave json?

165

Entonces, obtengo algunos valores JSON del servidor, pero no sé si habrá un campo en particular o no.

Asi como:

{ "regatta_name":"ProbaRegatta",
  "country":"Congo",
  "status":"invited"
}

Y a veces, habrá un campo adicional como:

{ "regatta_name":"ProbaRegatta",
  "country":"Congo",
  "status":"invited",
  "club":"somevalue"
}

Me gustaría verificar si el campo llamado "club" existe para que al analizar no obtenga org.json.JSONException: No hay valor para el club

Adam Varhegyi
fuente
if (jsonObject.getString ("club")! = null) {// obtener el vale aquí}
Software Sainath
3
No, a excepción del manejo, el código se detiene y no se ejecutarán más acciones de análisis.
Adam Varhegyi
1
@SoftwareSainath Eso no funciona, todavía tengo la excepción.
Adam Varhegyi
String clubvalue = ""; try (clubvalue = jsonobject.getString ("club");} catch (Exception e) {}
Software Sainath

Respuestas:

266

La clase JSONObject tiene un método llamado "has":

http://developer.android.com/reference/org/json/JSONObject.html#has(java.lang.String)

Devuelve verdadero si este objeto tiene una asignación de nombre. La asignación puede ser NULL.

Desarrollador PX
fuente
28
porque "contiene" es demasiado cursi? :)
Omri374
¿Qué pasa si la clave es de Integertipo?
Eido95
2
@ Eido95 tener Integeruna clave suena como una mala práctica. JSON debe estar con una clave de cadena y un valor de lo que necesite.
Nico
@ Eido95, creo que para un número entero siempre hay un valor, cada vez que declaras un número entero, debes inicializarlo con un valor.
Mut Tony
154

Puede verificar de esta manera donde 'HAS': devuelve verdadero si este objeto tiene una asignación de nombre. La asignación puede ser NULL.

if (json.has("status")) {
   String status = json.getString("status"));
}

if (json.has("club")) {
   String club = json.getString("club"));
}

También puede verificar usando 'isNull': devuelve verdadero si este objeto no tiene una asignación de nombre o si tiene una asignación cuyo valor es NULL.

if (!json.isNull("club"))
    String club = json.getString("club"));
Nirali
fuente
1
que lib JSON que están usando, se puede proporcionar un ejemplo simple para JSON-inteligente o JSON-sencilla
Samuel Owino
@samuelowino json es la variable que contiene su objeto
Fernando Torres
17

podría JSONObject#has, proporcionando la keyentrada como y comprobar si el método devuelve trueo false. Tambien podria

usar en optStringlugar de getString:

Devuelve el valor asignado por nombre si existe, coercitándolo si es necesario. Devuelve la cadena vacía si no existe tal mapeo

Cinta negra
fuente
1
Aunque este método puede ser útil para otros, esto no regresa si el valor existe. Si getStringhubiera devuelto una cadena vacía, optStringtambién devolvería una cadena vacía. La suposición le haría creer que la propiedad no está disponible en la situación de OP.
halfpastfour.am
@Blackbelt, ¿tiene fuentes para esto?
tsuz
10

Puedes usar has

public boolean has(String key)

Determine si JSONObject contiene una clave específica .

Ejemplo

JSONObject JsonObj = new JSONObject(Your_API_STRING); //JSONObject is an unordered collection of name/value pairs

if (JsonObj.has("address")) { 
    //Checking address Key Present or not
    String get_address = JsonObj .getString("address"); // Present Key
}
else {
    //Do Your Staff
}
IntelliJ Amiya
fuente
10

justo antes de leer la clave, compruébelo como antes de leer

JSONObject json_obj=new JSONObject(yourjsonstr);
if(!json_obj.isNull("club"))
{
  //it's contain value to be read operation
}
else
{
  //it's not contain key club or isnull so do this operation here
}

Definición de función isNull

Returns true if this object has no mapping for name or
if it has a mapping whose value is NULL. 

documentación oficial debajo del enlace para la isNullfunción

http://developer.android.com/reference/org/json/JSONObject.html#isNull(java.lang.String)

Usuario de desbordamiento de pila
fuente
2

Prueba esto

if(!jsonObj.isNull("club")){
    jsonObj.getString("club");
}
R9J
fuente
2
isNullen realidad es para verificar si la asignación es nula, no para verificar la disponibilidad de un miembro json.
Reza_Rg
2

Una mejor manera, en lugar de usar un condicional como:

if (json.has("club")) {
    String club = json.getString("club"));
 }

es simplemente usar el método existente optString (), así:

String club = json.optString("club);

el método optString ("clave") devolverá una Cadena vacía si la clave no existe y, por lo tanto, no generará una excepción.

fuzzKitty
fuente
2

Json tiene un método llamado containsKey().

Puede usarlo para verificar si cierta clave está contenida en el conjunto Json.

File jsonInputFile = new File("jsonFile.json"); 
InputStream is = new FileInputStream(jsonInputFile);
JsonReader reader = Json.createReader(is);
JsonObject frameObj = reader.readObject();
reader.close();

if frameObj.containsKey("person") {
      //Do stuff
}
Udana Methmal
fuente
1
I used hasOwnProperty('club')

var myobj = { "regatta_name":"ProbaRegatta",
    "country":"Congo",
    "status":"invited"
 };

 if ( myobj.hasOwnProperty("club"))
     // do something with club (will be false with above data)
     var data = myobj.club;
 if ( myobj.hasOwnProperty("status"))
     // do something with the status field. (will be true with above ..)
     var data = myobj.status;

Funciona en todos los navegadores actuales.

cdturner
fuente
1

Prueba esto:

let json=yourJson

if(json.hasOwnProperty(yourKey)){
    value=json[yourKey]
}
Aishwarya
fuente
1

Puede probar esto para verificar si la clave existe o no:

JSONObject object = new JSONObject(jsonfile);
if (object.containskey("key")) {
  object.get("key");
  //etc. etc.
}
Dorus Blanken
fuente
0

Solo estoy agregando otra cosa, en caso de que solo desee verificar si se crea algo en JSONObject o no, puede usar length (), porque de forma predeterminada cuando se inicializa JSONObject y no se inserta ninguna llave, solo tiene llaves vacías {}y el uso tiene (Tecla de cadena) no tiene ningún sentido.

Entonces puedes escribir if (jsonObject.length() > 0)y hacer tus cosas directamente .

¡Feliz aprendizaje!

Gurinder
fuente
0

Puede usar JsonNode # hasNonNull (String fieldName) , combina el método has y la verificación si es un valor nulo o no

Tiago Coelho
fuente