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
Addev
fonte
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

Experimente com json.isNull( "field-name" ).

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

K-ballo
fonte
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
FThompson
fonte
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");
}
timidamente
fonte
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")

Samir Mangroliya
fonte
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;                 
}
Thanhbinh84
fonte
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.

Lou Morda
fonte