2012-05-14 12 views
66

Jak wykryć, kiedy wartość json ma wartość NULL? np [{ "username": null}, { "username" "pusta"}]Android Json i wartości puste

W pierwszym przypadku oznacza użytkownika nieistniejącego i drugiego użytkownika o nazwie "pusta". Ale jeśli starają się je odzyskać obie wartości skutkować smyczkowy „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)); 

Wyjście dziennika jest

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

Czy kontrolujesz JSON? Następnie nie wysyłaj pola nazwy użytkownika i użyj metody 'has (java.lang.String);' – Blundell

+0

@Blundell Dzięki za komentarz, pomogło. –

+2

Jest to znany * i celowy * błąd: http://code.google.com/p/android/issues/detail?id=13830 – Heinzi

Odpowiedz

3

najpierw sprawdzić z isNull() .... jeśli cant praca spróbuj belows

a także masz JSONObject.NULL sprawdzić wartość null ...

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

oraz w Twój przypadek również sprawdzi, czy nie został sprawdzony: resultObject.getString("username").trim().eqauls("null")

+0

Uproszczone jako "if (! ResultObject.isNull (" username ") && resultObject.getString (" nazwa użytkownika "). Trim(). Length()! = 0)" –

13

Ponieważ JSONObject # getString zwraca wartość, jeśli t dany klucz istnieje, z definicji nie jest pusty. Z tego powodu istnieje JSONObject.NULL: reprezentujący zerową wartość JSON.

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

Dziękuję za odpowiedź, ale imho i ponieważ wyrzucany jest wyjątek JSONEx jeśli klucz nie istnieje, jest bardziej logiczny, zwracając wartość pustą, gdy element jest nieważny – Addev

+0

Będziesz musiał zająć preferencje stylistyczne z twórcami samej biblioteki: p – Vulcan

+1

"null"! = null. Problem polega na tym, że NULL potrzebuje api 9+, a czasami chcesz, aby niższe apisy działały. Ta odpowiedź jest dobrze, możesz użyć jsonObject.getString! = "Null" do. – sagits

3

Jeśli trzeba analizować JSON pierwszy i obsługi obiektu później, daj spróbować tej

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

dla Androida będzie jeśli zgłosi JSONException nie takie mapowanie istnieje. Więc nie możesz wywołać tej metody bezpośrednio.

json.getString("bye") 

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

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

lub

json.optString("bye"); 

zamiast.

W kodzie Demo,

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

to masz jest String "null" not null.

Shoud swój użyć

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

Oto metoda pomocnika używam tak, że mogę dostać ciągi JSON tylko jeden wiersz 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; 
     } 
} 

i wtedy coś takiego:

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

dałoby ci wartość ciągu lub bezpiecznie ustaw zmienną ciągu na wartość null. Używam Gsona, kiedy tylko mogę, aby uniknąć takich pułapek. Obsługuje wartości null znacznie lepiej moim zdaniem.

Powiązane problemy