Como verificar se existe uma chave json?


165

Portanto, recebo alguns valores JSON do servidor, mas não sei se haverá um campo específico ou não.

Assim como:

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

E, às vezes, haverá um campo extra como:

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

Gostaria de verificar se o campo chamado "clube" existe para que, na análise, não receba org.json.JSONException: nenhum valor para o clube


if (jsonObject.getString ("club")! = null) {// obtenha o vale aqui}
Software Sainath

3
Não, na manipulação de exceção, o código para e outras ações de análise não são executadas.
Adam Varhegyi

1
@SoftwareSainath Isso não funciona, ainda tem a exceção.
Adam Varhegyi

Cordas clubvalue = ""; try (clubvalue = jsonobject.getString ( "clube");} catch (Exception e) {}
Software Sainath

Respostas:


266

A classe JSONObject possui um método chamado "has":

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

Retorna true se esse objeto tiver um mapeamento para o nome. O mapeamento pode ser NULL.


28
porque "contém" é muito brega? :)
Omri374

E se a chave for do Integertipo?
Eido95 15/05

2
@ Eido95 ter uma Integerchave parece uma má prática. JSON deve estar com uma chave String e um valor do que você precisar.
Nico

@ Eido95, acredito que para um número inteiro sempre exista um valor, toda vez que você declara um número inteiro, é necessário inicializá-lo com um valor.
mut Tony

154

Você pode verificar desta maneira onde 'HAS' - Retorna verdadeiro se este objeto tiver um mapeamento para o nome. O mapeamento pode ser NULL.

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

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

Você também pode verificar usando 'isNull' - Retorna true se este objeto não possui mapeamento para nome ou se possui um mapeamento cujo valor é NULL.

if (!json.isNull("club"))
    String club = json.getString("club"));

1
que lib JSON você está usando, você pode fornecer um exemplo simples para JSON-inteligente ou JSON-simples
samuel Owino

json @samuelowino é a variável wich contém seu objeto
Fernando Torres

17

você poderia JSONObject#has, fornecendo a keyentrada as e verifique se o método retorna trueou false. Você também poderia

use em optStringvez de getString:

Retorna o valor mapeado pelo nome, se existir, coagindo-o, se necessário. Retorna a string vazia se esse mapeamento não existir


1
Embora esse método possa ser útil para outros, isso não retornará se o valor existir. Se getStringtivesse retornado uma sequência vazia, optStringtambém retornaria uma sequência vazia. Supõe-se que você acredite que o imóvel não está disponível na situação do OP.
Halfpastfour.am

@Blackbelt você tem fontes para isso?
tsuz 6/10/16

10

Você pode usar has

public boolean has(String key)

Determine se o JSONObject contém uma chave específica .

Exemplo

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
}

10

pouco antes da tecla de leitura, verifique como antes da leitura

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
}

definição da função isNull

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

documentação oficial abaixo link para isNullfunção

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


2

Tente isto

if(!jsonObj.isNull("club")){
    jsonObj.getString("club");
}

2
isNullé realmente para verificar se o mapeamento é nulo, não para verificar a disponibilidade de um membro json.
Reza_Rg

2

Uma maneira melhor, em vez de usar um condicional como:

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

é simplesmente usar o método existente optString (), assim:

String club = json.optString("club);

o método optString ("key") retornará uma String vazia se a chave não existir e, portanto, não emitirá uma exceção.


2

Json tem um método chamado containsKey().

Você pode usá-lo para verificar se uma determinada chave está contida no 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
}

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 em todos os navegadores atuais.


1

Tente o seguinte:

let json=yourJson

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

1

Você pode tentar isso para verificar se a chave existe ou não:

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

0

Estou apenas adicionando outra coisa: caso você queira apenas verificar se alguma coisa foi criada em JSONObject ou não, você pode usar length (), porque, por padrão, quando JSONObject é inicializado e nenhuma chave é inserida, ele tem chaves vazias {}e o uso de has (Tecla String) não faz nenhum sentido.

Então você pode escrever if (jsonObject.length() > 0)e fazer suas coisas diretamente .

Feliz aprendizado!


0

Você pode usar o JsonNode # hasNonNull (String fieldName) , ele mistura o método has e a verificação se é um valor nulo ou não

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.