Android Json และค่า null


94

ฉันจะตรวจจับได้อย่างไรเมื่อค่า json เป็นโมฆะ ตัวอย่างเช่น: [{"username": null}, {"username": "null"}]

กรณีแรกแสดงถึงชื่อผู้ใช้ที่ไม่มีอยู่และผู้ใช้ที่สองชื่อ "null" แต่ถ้าคุณพยายามดึงทั้งสองค่าจะส่งผลให้สตริงเป็น "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));

เอาต์พุตบันทึกคือ

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

1
คุณควบคุม JSON หรือไม่? จากนั้นอย่าส่งฟิลด์ชื่อผู้ใช้และใช้has(java.lang.String);เมธอด
Blundell

2
นี่เป็นข้อบกพร่องที่ทราบและเกิดขึ้นโดยเจตนา : code.google.com/p/android/issues/detail?id=13830
Heinzi

คำตอบ:


220

json.isNull( "field-name" )ลองกับ

อ้างอิง: http://developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29


4
ฉันจะพูดต่อไปว่าไม่เคยใช้มี (KEY_NAME) แทนที่การเรียกเหล่านั้นเป็น! isNull (KEY_NAME)
Sky Kelsey

@SkyKelsey: ทำไมถึงพูดแบบนั้นล่ะ? นี่คือสิ่งที่แตกต่างกันด้วยความหมายที่แตกต่างกัน ...
K-ballo

คุณถูก. สิ่งที่ฉันหมายถึงก็คือเวลาส่วนใหญ่ที่คุณใช้ has () คุณอยากจะเป็นเราจริงๆ! isNull () เวลาส่วนใหญ่คุณกำลังตรวจสอบเพื่อดูว่ามีค่าที่คีย์ที่ระบุไว้หรือไม่และทำได้ดีกว่าด้วย! isNull ()
Sky Kelsey

17

เนื่องจาก JSONObject # getString ส่งคืนค่าหากคีย์ที่กำหนดมีอยู่จึงไม่เป็นโมฆะตามนิยาม นี่คือเหตุผลที่มี JSONObject.NULL: เพื่อแทนค่า JSON ว่าง

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

1
ขอบคุณสำหรับคำตอบของคุณ แต่ imho และเนื่องจาก JSONException ถูกโยนออกไปหากคีย์ไม่มีอยู่จะส่งคืนค่า null เชิงตรรกะมากขึ้นเมื่อรายการเป็นโมฆะ
Addev

คุณจะต้องใช้การตั้งค่าโวหารกับนักพัฒนาของห้องสมุดเอง: p
FThompson

1
"null"! = null ปัญหาคือ isNull ต้องการ api 9+ และบางครั้งคุณต้องการให้ apis ต่ำกว่าทำงาน คำตอบนี้ดีคุณสามารถใช้ jsonObject.getString! = "null" เพื่อ
หยุด

14

สำหรับ Android จะเพิ่ม JSONException หากไม่มีการแมปดังกล่าว คุณจึงไม่สามารถเรียกวิธีนี้ได้โดยตรง

json.getString("bye")

หากข้อมูลของคุณว่างเปล่า (อาจไม่มีคีย์) ให้ลอง

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

หรือ

json.optString("bye");

แทน.

ในรหัสสาธิตของคุณไฟล์

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

สิ่งที่คุณได้รับคือ String "null" ไม่ใช่ null

การใช้งานของคุณ

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

4

ก่อนอื่นให้ตรวจสอบกับisNull().... ถ้าไม่สามารถทำงานได้ให้ลองด้านล่าง

และคุณต้องJSONObject.NULLตรวจสอบค่า null ...

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

และในกรณีของคุณตรวจสอบด้วย resultObject.getString("username").trim().eqauls("null")


ย่อเป็น "if (! resultObject.isNull (" username ") && resultObject.getString (" username "). trim (). length ()! = 0)"
Sky Kelsey

3

หากคุณต้องแยกวิเคราะห์ json ก่อนและจัดการวัตถุในภายหลังให้ลองทำเช่นนี้

โปรแกรมแยกวิเคราะห์

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

ตัวจัดการ

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

นี่เป็นวิธีผู้ช่วยที่ฉันใช้เพื่อรับสตริง JSON ด้วยโค้ดเพียงบรรทัดเดียว:

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

แล้วสิ่งนี้:

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

จะให้ค่าสตริงของคุณหรือตั้งค่าตัวแปรสตริงของคุณเป็น null อย่างปลอดภัย ฉันใช้ Gson ทุกครั้งที่ทำได้เพื่อหลีกเลี่ยงข้อผิดพลาดเช่นนี้ มันจัดการกับค่า null ได้ดีกว่ามากในความคิดของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.