Android Json ve boş değerler


94

Bir json değerinin boş olduğunu nasıl tespit edebilirim? örneğin: [{"kullanıcı adı": null}, {"kullanıcı adı": "boş"}]

İlk durum var olmayan bir kullanıcı adını ve ikincisi "boş" adlı bir kullanıcıyı temsil eder. Ancak bunları almaya çalışırsanız, her iki değer de "null" dizesiyle sonuçlanır

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

Günlük çıktısı

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

1
JSON'u kontrol ediyor musunuz? Ardından kullanıcı adı alanını göndermek ve kullanmayan has(java.lang.String);yöntemi
Blundell

2
Bu bilinen ve kasıtlı bir hatadır: code.google.com/p/android/issues/detail?id=13830
Heinzi

Yanıtlar:


220

4
Daha ileri gidip ASLA has (KEY_NAME) kullan, bu çağrıları! İsNull (KEY_NAME) olarak değiştiririm.
Sky Kelsey

@SkyKelsey: Bunu neden söylüyorsun? Bunlar farklı anlamlara sahip farklı şeyler ...
K-ballo

Haklısın. Demek istediğim, kullandığın çoğu zaman has (), bizi gerçekten tercih edersin! İsNull (). Çoğu zaman, belirtilen anahtarda bir değer olup olmadığını kontrol edersiniz ve bu,! İsNull () ile daha iyi başarılır.
Sky Kelsey

17

JSONObject # getString, verilen anahtar varsa bir değer döndürdüğünden, tanım gereği boş değildir. JSONObject.NULL öğesinin var olmasının nedeni budur: boş bir JSON değerini temsil etmek.

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

1
Cevabınız için teşekkürler ama imho ve bir JSONException atıldığından, anahtar yoksa, öğe boş olduğunda daha mantıklı bir boş döndürür
Addev

Kütüphanenin geliştiricileriyle birlikte biçimsel tercihler yapmanız gerekecek: p
FThompson

1
"boş"! = boş. Sorun şu ki, Null'un api 9+ 'e ihtiyacı var ve bazen daha düşük apis'in çalışmasını istiyorsunuz. Bu cevap iyi, jsonObject.getString! = "Null" için kullanabilirsiniz.
2014 saat

14

Android için böyle bir eşleştirme yoksa bir JSONException oluşturur. Yani bu yöntemi doğrudan arayamazsınız.

json.getString("bye")

Verileriniz boş olabilirse (anahtar olmayabilir), deneyin

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

veya

json.optString("bye");

yerine.

Demo kodunuzda,

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

bu aldığınız String "null" null değil.

senin şud kullan

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

4

önce isNull().... ile kontrol edin, eğer işe yaramazsa sonra aşağıdakileri deneyin

ve ayrıca JSONObject.NULLboş değeri kontrol etmelisiniz ...

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

ve senin durumunda da kontrol et resultObject.getString("username").trim().eqauls("null")


"İf (! ResultObject.isNull (" kullanıcı adı ") && resultObject.getString (" kullanıcı adı "). Trim (). Uzunluk ()! = 0)" olarak basitleştirildi
Sky Kelsey

3

Önce json çözümlemeniz ve daha sonra nesneyi işlemeniz gerekiyorsa, şunu deneyelim

Ayrıştırıcı

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

İşleyici

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

İşte JSON dizelerini yalnızca bir satır kodla alabilmem için kullandığım bir yardımcı yöntem:

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

ve sonra bunun gibi bir şey:

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

size dize değerinizi verir veya dize değişkeninizi güvenli bir şekilde null olarak ayarlar. Böyle tuzaklardan kaçınmak için elimden geldiğince Gson kullanıyorum. Bence boş değerleri çok daha iyi ele alıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.