Soru JSON jsonObject.optString (), "null" dizesini döndürür


Sunucu iletişimi için JSON kullanan bir Android Uygulaması geliştiriyorum ve json dosyasını ayrıştırmaya çalıştığımda garip bir sorunum var.

Bu benim sunucumdan json

{
    "street2": null,
    "province": null,
    "street1": null,
    "postalCode": null,
    "country": null,
    "city": null
}

Çağırmak için City değerini alıyorum String city = address.optString("city", "") adresimde Json-nesnesi. Bu durum için bekliyorum cityboş olmak (bunun için optString burada değil mi?) ama aslında "null" dizesini içerir. Dize metin içerdiğinden daha fazla boş veya isEmpty-check false döndürür. Eğer ararsam address.isNull("city") doğru olanı döndürür. Bir tek optString başarısız olur.

Bu sorun için Google'da veya Stackoverflow'ta hiçbir şey bulamadım. Düşündüğümde nasıl olabileceğini anlamıyorum. optString Tam olarak beklediğim şeyi yapardı. Burada neyin yanlış gittiğini bilen var mı?


42
2017-08-14 08:06


Menşei


null java'da (ve bildiğim diğer programlama dillerinde) bir dize için geçerli bir değerdir, bu nedenle, geri dönüşü seçmeyeceği anlamına gelir, eğer anahtar basitçe mevcut değilse, geri dönüşü alır - x4rf41
Teşekkürler. Beklediğim davranış değil SÇNDİZGESİ ama geliştiricinin aklında farklı bir şey olduğu görünüyor. Çekimi kendim yapmalıyım. - joshplusa


Cevaplar:


Bu soruna koşarken ve kafanı kaşıyarak yalnız değilsiniz, "Bunu gerçekten anlamış olabilir mi?" Bir AOSP sorununa göre, Google mühendisleri did  bu bir hata düşününama org.json uygulamasıyla uyumlu, hatta hata uyumlu olsalar bile.

Bunu düşünürseniz, mantıklıdır, çünkü aynı kütüphaneleri kullanan diğer Java ortamlarında çalışan diğer kodlar Android'de farklı davranırsa, 3. parti kütüphaneleri kullanıldığında büyük uyumluluk problemleri olacaktır. Niyetler iyiyse ve gerçekten hatalar düzeltse bile, yepyeni bir solucan kutusu açabilirdi.

Göre AOSP sorunu:

Davranış kasıtlıdır; org.json ile hata uyumlu olmak için yola çıktık. Artık bu düzeltildi, kodumuzu da düzeltmemiz gerekip gerekmediği belli değil. Uygulamalar bu buggy davranışına bel bağlamış olabilir.

Bu size keder yaratıyorsa, json.isNull () gibi null değerini sınamak için farklı bir mekanizma kullanarak geçici çözüm öneririm.

İşte size yardımcı olacak basit bir yöntem:

/** Return the value mapped by the given key, or {@code null} if not present or null. */
public static String optString(JSONObject json, String key)
{
    // http://code.google.com/p/android/issues/detail?id=13830
    if (json.isNull(key))
        return null;
    else
        return json.optString(key, null);
}

75
2018-04-30 01:04



Neden ara json.optString(key, null) ve sadece değil json.getString(key) özel yönteminizde - Alexander Farber
Yardımcı yöntem, yerine geçer. optString değil getString. opt anlamına geliyor isteğe bağlı ve anahtar yoksa bir istisna alamaz. - Matt Quigley
Büyük yardım! Çok teşekkürler - gunjot singh


Temelde 2 seçeneğiniz var:

1) null değerlerle bir JSON yükünü gönder

{
"street2": "s2",
"province": "p1",
"street1": null,
"postalCode": null,
"country": null,
"city": null
}

Boş değerleri kontrol etmeli ve bunları buna göre çözümlemelisiniz:

private String optString_1(final JSONObject json, final String key) {
    return json.isNull(key) ? null : json.optString(key);
}

2) Anahtarları boş değerlerle göndermeyin ve optString (anahtar, null) özelliğini doğrudan kullanın (bant genişliğinden tasarruf etmelisiniz).

{
"street2": "s2",
"province": "p1"
}

23
2017-08-14 22:09



Json.isNull (anahtar) için +1, neden (json.get (key) == null) düzgün çalışmıyorsa - macio.Jun
Deneyin (json.get (key) .equals ("null)). Çalışır. - DevAndroid
Dikkatli olun: Anahtar bulunamazsa json.optString (anahtar) boş bir dize döndürür. - Stephane JAIS


if (json != null && json.getString(KEY_SUCCESS) != null){
     // PARSE RESULT 
}else{
    // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE

}

Oradaki anahtar kelimeyle birlikte json'u kontrol etmek için.

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

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

senin shoud kullanımı

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

önce isNull () ile kontrol edin .... eğer işe yaramazsa belows deneyin

ve ayrıca null değerini kontrol etmek için JSONObject.NULL var ...

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

Önce json'u ayrıştırmanız ve daha sonra nesneyi ele almanız gerekiyorsa, bunu deneyelim

Ayrıştırıcı

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

0
2017-08-28 10:12





Anahtar için değerler aşağıdaki gibi boşsa

{

"durum": 200,

"mesaj": "",

"veri": {

"totalFare": null,

},

}

Örn. için "isNull" ile kontrol edin:

Dize strTotalFare;

if (objResponse.isNull ("totalFare"))

{

strTotalFare = "0";

} Başka {

strTotalFare = objResponse.getString ("totalFare");

}

"totalFare" tuşu için değer "null" ise, yukarıdaki fonksiyon sıfır değerine girer ve atarsa ​​anahtardan gerçek değer alır.


0
2018-06-12 06:11





Matt Quigley'in cevabını temel olarak kullanarak, Kotlin ve Java'da yazılan geri dönüş kısmı da dahil olmak üzere, optString'in tüm işlevlerini taklit etmek istiyorsanız, buradaki kod.

Kotlin:

fun optString(json: JSONObject, key: String, fallback: String?): String? {
    var stringToReturn = fallback
    if (!json.isNull(key)) {
        stringToReturn = json.optString(key, null)
    }
    return stringToReturn
}

Java:

public static String optString(JSONObject json, String key, String fallback) {
    String stringToReturn = fallback;
    if (!json.isNull(key)) {
        stringToReturn = json.optString(key, null);
    }
    return stringToReturn;
 }

Geri dönüşe ihtiyacınız yoksa, geri dönüş parametresi için null değerini girin.


0
2017-07-05 23:15





Josn çözümleyicim uzundu ve bunu düzeltmek için yeni bir sınıf oluşturmak zorundaydı. Daha sonra her yönteme sadece 1 ek satır eklemek ve mevcut JSONObject özellik adını yeniden adlandırmak zorunda kaldı, böylece diğer tüm çağrılar JSONObject yerine yeni sınıfa başvuruyordu.

    public static ArrayList<PieceOfNews> readNews(String json) {
    if (json != null) {
        ArrayList<PieceOfNews> res = new ArrayList<>();
        try {
            JSONArray jsonArray = new JSONArray(json);
            for (int i = 0; i < jsonArray.length(); i++) {
                //before JSONObject jo = jsonArray.getJSONObject(i);
                JSONObject joClassic = jsonArray.getJSONObject(i);
                //facade
                FixJsonObject jo = new FixJsonObject(joClassic);
                PieceOfNews pn = new PieceOfNews();
                pn.setId(jo.getInt("id"));
                pn.setImageUrl(jo.getString("imageURL"));
                pn.setText(jo.getString("text"));
                pn.setTitle(jo.getString("title"));
                pn.setDate(jo.getLong("mills"));
                res.add(pn);
            }
            return res;
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return null;
}

İşte ihtiyacım olan yöntemlerle sınıfım, daha fazlasını ekleyebilirsiniz

public class FixJsonObject {
private JSONObject jsonObject;

public FixJsonObject(JSONObject jsonObject) {
    this.jsonObject = jsonObject;
}

public String optString(String key, String defaultValue) {
    if (jsonObject.isNull(key)) {
        return null;
    } else {
        return jsonObject.optString(key, defaultValue);
    }
}

public String optString(String key) {
    return optString(key, null);
}

public int optInt(String key) {
    if (jsonObject.isNull(key)) {
        return 0;
    } else {
        return jsonObject.optInt(key, 0);
    }
}

public double optDouble(String key) {
    return optDouble(key, 0);
}

public double optDouble(String key, double defaultValue) {
    if (jsonObject.isNull(key)) {
        return 0;
    } else {
        return jsonObject.optDouble(key, defaultValue);
    }
}

public boolean optBoolean(String key, boolean defaultValue) {
    if (jsonObject.isNull(key)) {
        return false;
    } else {
        return jsonObject.optBoolean(key, defaultValue);
    }
}

public long optLong(String key) {
    if (jsonObject.isNull(key)) {
        return 0;
    } else {
        return jsonObject.optLong(key, 0);
    }
}

public long getLong(String key) {
    return optLong(key);
}

public String getString(String key) {
    return optString(key);
}

public int getInt(String key) {
    return optInt(key);
}

public double getDouble(String key) {
    return optDouble(key);
}

public JSONArray getJSONArray(String key) {
    if (jsonObject.isNull(key)) {
        return null;
    } else {
        return jsonObject.optJSONArray(key);
    }
}

}


0
2018-06-05 10:01