Android Json und Nullwerte

94

Wie kann ich erkennen, wenn ein JSON-Wert null ist? Zum Beispiel: [{"Benutzername": null}, {"Benutzername": "null"}]

Der erste Fall repräsentiert einen nicht existierenden Benutzernamen und der zweite einen Benutzer mit dem Namen "null". Wenn Sie jedoch versuchen, beide Werte abzurufen, wird die Zeichenfolge "null" angezeigt.

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

Die Protokollausgabe ist

{"hello":"null","bye":null}
hello=null is null? false
bye=null is null? false
Addev
quelle
1
Kontrollieren Sie den JSON? Dann senden Sie nicht das Feld Benutzername und verwenden Sie die has(java.lang.String);Methode
Blundell
2
Dies ist ein bekannter und absichtlicher Fehler: code.google.com/p/android/issues/detail?id=13830
Heinzi

Antworten:

220

Versuchen Sie es mit json.isNull( "field-name" ).

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

K-Ballo
quelle
4
Ich würde weiter gehen und sagen, NIEMALS has (KEY_NAME) zu verwenden und diese Aufrufe von! IsNull (KEY_NAME) zu ersetzen.
Sky Kelsey
@ SkyKelsey: Warum würdest du das sagen? Das sind verschiedene Dinge mit unterschiedlicher Semantik ...
K-Ballo
Du hast recht. Was ich damit gemeint habe war, dass Sie die meiste Zeit haben (), Sie würden uns wirklich vorziehen! IsNull (). Meistens überprüfen Sie, ob bei dem angegebenen Schlüssel ein Wert vorhanden ist, und dies wird besser mit! IsNull () erreicht.
Sky Kelsey
17

Da JSONObject # getString einen Wert zurückgibt, wenn der angegebene Schlüssel vorhanden ist, ist er per Definition nicht null. Dies ist der Grund, warum JSONObject.NULL existiert: um einen Null-JSON-Wert darzustellen.

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true
FThompson
quelle
1
Vielen Dank für Ihre Antwort, aber imho und da eine JSONException ausgelöst wird, wenn der Schlüssel nicht existiert, ist es logischer, null zurückzugeben, wenn das Element null ist
Addev
Sie müssen stilistische Vorlieben mit den Entwicklern der Bibliothek selbst aufnehmen: p
FThompson
1
"null"! = null. Das Problem ist, dass isNull API 9+ benötigt und manchmal möchten Sie, dass niedrigere APIs funktionieren. Diese Antwort ist gut, Sie können jsonObject.getString! = "Null" verwenden.
Sagits
14

Für Android wird eine JSONException ausgelöst, wenn keine solche Zuordnung vorhanden ist. Sie können diese Methode also nicht direkt aufrufen.

json.getString("bye")

Wenn Ihre Daten leer sein können (der Schlüssel ist möglicherweise nicht vorhanden), versuchen Sie es

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

oder

json.optString("bye");

stattdessen.

In Ihrem Demo-Code ist die

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

Dies ist String "null", nicht null.

Ihre sollte verwenden

if(json.isNull("hello")) {
    helloStr = null;
} else {
    helloStr = json.getString("hello");
}
schüchtern
quelle
4

Überprüfen Sie zuerst mit isNull().... wenn nicht funktionieren kann, dann versuchen Sie es unten

und außerdem müssen Sie JSONObject.NULLden Nullwert überprüfen ...

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

und in deinem Fall auch überprüfen resultObject.getString("username").trim().eqauls("null")

Samir Mangroliya
quelle
Vereinfacht als "if (! ResultObject.isNull (" Benutzername ") && resultObject.getString (" Benutzername "). Trim (). Length ()! = 0)"
Sky Kelsey
3

Wenn Sie zuerst json analysieren und das Objekt später verarbeiten müssen, versuchen Sie dies

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
quelle
2

Hier ist eine Hilfsmethode, mit der ich JSON-Zeichenfolgen mit nur einer Codezeile abrufen kann:

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

und dann so etwas:

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

würde Ihnen Ihren Zeichenfolgenwert geben oder Ihre Zeichenfolgenvariable sicher auf null setzen. Ich benutze Gson, wann immer ich kann, um solche Fallstricke zu vermeiden. Es geht meiner Meinung nach viel besser mit Nullwerten um.

Lou Morda
quelle