Android Json i wartości null

94

Jak mogę wykryć, że wartość json jest zerowa? na przykład: [{"nazwa użytkownika": null}, {"nazwa użytkownika": "null"}]

Pierwszy przypadek reprezentuje nieistniejącą nazwę użytkownika, a drugi użytkownika o nazwie „null”. Ale jeśli spróbujesz pobrać je obie wartości, w rezultacie otrzymasz ciąg „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));

Dane wyjściowe dziennika to

{"hello":"null","bye":null}
hello=null is null? false
bye=null is null? false
Addev
źródło
1
Czy kontrolujesz JSON? Więc nie wysyłaj pola nazwy użytkownika i użyj has(java.lang.String);metody
Blundell
2
To znany i zamierzony błąd: code.google.com/p/android/issues/detail?id=13830
Heinzi

Odpowiedzi:

220

Spróbuj z json.isNull( "field-name" ).

Źródła: http://developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29

K-ballo
źródło
4
Poszedłbym dalej i powiedziałbym, że NIGDY nie używaj has (KEY_NAME), zastępując te wywołania! IsNull (KEY_NAME).
Sky Kelsey,
@SkyKelsey: Dlaczego tak mówisz? To różne rzeczy z różną semantyką ...
K-ballo
Masz rację. Chodziło mi o to, że przez większość czasu, którego używasz ma (), naprawdę wolisz nas! IsNull (). W większości przypadków sprawdzasz, czy w określonym kluczu istnieje wartość, a lepiej to zrobić za pomocą! IsNull ().
Sky Kelsey,
17

Ponieważ JSONObject # getString zwraca wartość, jeśli dany klucz istnieje, nie jest on z definicji pusty. To jest powód, dla którego istnieje JSONObject.NULL: aby reprezentować pustą wartość JSON.

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true
FThompson
źródło
1
Dziękuję za odpowiedź, ale imho, a ponieważ wyjątek JSONE jest wyrzucany, jeśli klucz nie istnieje, bardziej logiczne jest zwracanie wartości null, gdy pozycja jest pusta
Addev
Będziesz musiał
ustalić
1
„null”! = null. Problem polega na tym, że isNull potrzebuje api 9+ i czasami chcesz, aby niższe API działało. Ta odpowiedź jest dobra, możesz użyć jsonObject.getString! = "Null", aby.
sagits
14

W przypadku Androida spowoduje to wyjątek JSONE, jeśli nie istnieje takie mapowanie. Nie możesz więc bezpośrednio wywołać tej metody.

json.getString("bye")

jeśli twoje dane mogą być puste (może nie istnieć klucz), spróbuj

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

lub

json.optString("bye");

zamiast.

W twoim kodzie demonstracyjnym

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

otrzymujesz to String "null" nie null.

powinieneś używać

if(json.isNull("hello")) {
    helloStr = null;
} else {
    helloStr = json.getString("hello");
}
nieśmiało
źródło
4

najpierw sprawdź isNull()… jeśli nie działa, spróbuj poniżej

a także musisz JSONObject.NULLsprawdzić wartość null ...

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

aw twoim przypadku też sprawdź resultObject.getString("username").trim().eqauls("null")

Samir Mangroliya
źródło
Uproszczone jako „if (! ResultObject.isNull („ nazwa użytkownika ”) && resultObject.getString („ nazwa użytkownika ”). Trim (). Length ()! = 0)”
Sky Kelsey
3

Jeśli musisz najpierw przeanalizować json, a później obsłużyć obiekt, spróbujmy tego

Parser

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

Treser

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
źródło
2

Oto metoda pomocnicza, której używam, aby uzyskać ciągi JSON z tylko jedną linią kodu:

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

a potem coś takiego:

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

poda wartość ciągu lub bezpiecznie ustawi zmienną łańcuchową na null. Używam Gson, kiedy tylko mogę, aby uniknąć takich pułapek. Moim zdaniem znacznie lepiej radzi sobie z wartościami zerowymi.

Lou Morda
źródło