Android Json dan nilai null


94

Bagaimana saya bisa mendeteksi ketika nilai json adalah null? contoh: [{"username": null}, {"username": "null"}]

Kasus pertama mewakili nama pengguna yang tidak ada dan yang kedua adalah pengguna bernama "null". Tetapi jika Anda mencoba mengambil keduanya, kedua nilai akan menghasilkan string "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));

Output lognya adalah

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

1
Apakah Anda mengontrol JSON? Maka jangan kirim bidang nama pengguna dan gunakan has(java.lang.String);metode
Blundell

2
Ini adalah bug yang diketahui dan disengaja : code.google.com/p/android/issues/detail?id=13830
Heinzi

Jawaban:


220

4
Saya akan melangkah lebih jauh dan mengatakan untuk TIDAK PERNAH menggunakan (KEY_NAME), mengganti panggilan tersebut ke! IsNull (KEY_NAME).
Sky Kelsey

@ SkyKelsey: Mengapa Anda mengatakan itu? Itu adalah hal yang berbeda dengan semantik yang berbeda ...
K-ballo

Kamu benar. Apa yang saya maksudkan adalah bahwa sebagian besar waktu yang Anda gunakan has (), Anda benar-benar lebih memilih kami! IsNull (). Sebagian besar waktu Anda memeriksa untuk melihat apakah ada nilai pada kunci yang ditentukan, dan itu lebih baik dicapai dengan! IsNull ().
Sky Kelsey

17

Karena JSONObject # getString mengembalikan nilai jika kunci yang diberikan ada, menurut definisi tidak null. Inilah alasan keberadaan JSONObject.NULL: untuk mewakili nilai JSON null.

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

1
Terima kasih atas jawaban Anda tetapi imho dan karena JSONException dilemparkan jika kuncinya tidak ada lebih logis mengembalikan null ketika itemnya null
Addev

Anda harus menggunakan preferensi gaya dengan pengembang perpustakaan itu sendiri: p
FThompson

1
"null"! = null. Masalahnya adalah isNull membutuhkan api 9+ dan terkadang Anda ingin api yang lebih rendah berfungsi. Jawaban ini bagus, Anda dapat menggunakan jsonObject.getString! = "Null" untuk.
sagits

14

Untuk android, ini akan memunculkan JSONException jika tidak ada pemetaan seperti itu. Jadi Anda tidak bisa memanggil metode ini secara langsung.

json.getString("bye")

jika data anda bisa kosong (mungkin tidak ada kuncinya), coba

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

atau

json.optString("bye");

sebagai gantinya.

Dalam kode demo Anda,

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

ini yang Anda dapatkan adalah String "null" bukan null.

penggunaan shoud Anda

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

4

pertama periksa dengan isNull().... jika tidak bisa bekerja kemudian coba di bawah ini

dan juga Anda harus JSONObject.NULLmemeriksa nilai null ...

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

dan dalam kasus Anda juga periksa resultObject.getString("username").trim().eqauls("null")


Disederhanakan sebagai "if (! ResultObject.isNull (" username ") && resultObject.getString (" username "). Trim (). Length ()! = 0)"
Sky Kelsey

3

Jika Anda harus mengurai json terlebih dahulu dan menangani objek nanti, mari coba ini

Parser

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

Penangan

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

Berikut adalah metode pembantu yang saya gunakan sehingga saya bisa mendapatkan string JSON hanya dengan satu baris kode:

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

dan kemudian sesuatu seperti ini:

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

akan memberi Anda nilai string atau dengan aman menyetel variabel string Anda ke null. Saya menggunakan Gson kapan pun saya bisa untuk menghindari jebakan seperti ini. Ini menangani nilai nol jauh lebih baik menurut saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.