Android Json e valores nulos


94

Como posso detectar quando um valor json é nulo? por exemplo: [{"username": null}, {"username": "null"}]

O primeiro caso representa um nome de usuário inexistente e o segundo um usuário denominado "null". Mas se você tentar recuperar os dois valores resultarão na string "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));

A saída do log é

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

1
Você controla o JSON? Então não envie o campo de nome de usuário e use o has(java.lang.String);método
Blundell

2
Este é um bug conhecido e intencional : code.google.com/p/android/issues/detail?id=13830
Heinzi

Respostas:


220

4
Eu iria mais longe e diria para NUNCA usar has (KEY_NAME), substituindo essas chamadas para! IsNull (KEY_NAME).
Sky Kelsey de

@SkyKelsey: Por que você diria isso? São coisas diferentes com semânticas diferentes ...
K-ballo

Você está certo. O que eu quis dizer é que na maioria das vezes que você usa has (), você realmente prefere que nós! IsNull (). Na maioria das vezes, você está verificando se existe um valor na chave especificada, e isso é melhor realizado com! IsNull ().
Sky Kelsey de

17

Como JSONObject # getString retorna um valor se a chave fornecida existir, ele não é nulo por definição. Este é o motivo pelo qual JSONObject.NULL existe: para representar um valor JSON nulo.

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

1
Obrigado por sua resposta, mas imho e como uma JSONException é lançada se a chave não existir, é mais lógico retornar nulo quando o item for nulo
Addev

Você precisará assumir preferências estilísticas com os desenvolvedores da própria biblioteca: p
FThompson

1
"null"! = null. O problema é que o isNull precisa da API 9+ e, às vezes, você deseja que as APIs inferiores funcionem. Esta resposta é boa, você pode usar jsonObject.getString! = "Null" para.
sagits em

14

Para o Android, ele gerará uma JSONException se esse mapeamento não existir. Portanto, você não pode chamar esse método diretamente.

json.getString("bye")

se seus dados podem estar vazios (pode não existir a chave), tente

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

ou

json.optString("bye");

em vez de.

Em seu código de demonstração, o

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

isso que você obtém é String "null" não nula.

seu shoud use

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

4

primeiro verifique com isNull() ... se não funcionar, tente abaixo

e também você tem JSONObject.NULLque verificar o valor nulo ...

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

e no seu caso também verifique resultObject.getString("username").trim().eqauls("null")


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

3

Se você deve analisar json primeiro e manipular o objeto depois, vamos tentar isso

Parser

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

Handler

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

Este é um método auxiliar que uso para obter strings JSON com apenas uma linha 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;
        }
}

e então algo assim:

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

forneceria seu valor de string ou definiria com segurança sua variável de string como nula. Eu uso Gson sempre que posso para evitar armadilhas como essas. Ele lida com valores nulos muito melhor na minha opiniã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.