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
Addev
sumber
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

Coba dengan json.isNull( "field-name" ).

Referensi: http://developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29

K-ballo
sumber
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
FThompson
sumber
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");
}
malu-malu
sumber
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")

Samir Mangroliya
sumber
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;                 
}
thanhbinh84.dll
sumber
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.

Lou Morda
sumber