Android Json और शून्य मान


94

जब एक मान मूल्य शून्य है तो मैं कैसे पता लगा सकता हूं? उदाहरण के लिए: [{"उपयोगकर्ता नाम": 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) है।
स्काई केल्से

@SkyKelsey: आप ऐसा क्यों कहेंगे? वे अलग
-

आप सही हे। मेरा मतलब था कि आपके द्वारा उपयोग किए जाने वाले अधिकांश समय (), आप वास्तव में हमारे लिए हैं! अधिकांश समय आप यह देखने के लिए जाँच कर रहे हैं कि क्या कोई मान निर्दिष्ट कुंजी पर मौजूद है, और यह बेहतर है!
स्काई केल्सी

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 को फेंक दिया जाता है, यदि कुंजी मौजूद नहीं है, तो अधिक तार्किक वापसी शून्य है जब आइटम अशक्त है
Addev

आपको पुस्तकालय के डेवलपर्स के साथ शैलीगत प्राथमिकताओं को
अपनाने की आवश्यकता होगी

1
"null"! = null समस्या यह है कि Null को api 9+ की आवश्यकता है और कभी-कभी आप चाहते हैं कि लोअर एपिस काम करे। यह उत्तर ठीक है, आप jsonObject.getString! = "Null" का उपयोग कर सकते हैं।
sagits

14

Android के लिए यह JSONException बढ़ाएगा यदि ऐसी कोई मैपिंग मौजूद नहीं है। इसलिए आप इस विधि को सीधे नहीं कह सकते।

json.getString("bye")

यदि आप डेटा रिक्त हो सकते हैं (कुंजी मौजूद नहीं हो सकती है), तो प्रयास करें

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

या

json.optString("bye");

बजाय।

आपके डेमो कोड में,

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

यह आपको मिलता है स्ट्रिंग "अशक्त" शून्य नहीं है।

अपने जोर का उपयोग करें

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

4

पहले के साथ की जाँच करें isNull().... अगर कठबोली काम तो बेल्ट की कोशिश करो

और आपको JSONObject.NULLअशक्त मूल्य की जांच करनी होगी ...

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

और आपके मामले में भी जाँच करें resultObject.getString("username").trim().eqauls("null")


के रूप में सरलीकृत "अगर (! ResultObject.isNull (" उपयोगकर्ता नाम ") && resultObject.getString (" उपयोगकर्ता नाम "।) ट्रिम () लंबाई () = 0।!)"
आकाश केल्सी

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

आपको अपना स्ट्रिंग मान देगा या सुरक्षित रूप से अपने स्ट्रिंग चर को शून्य में सेट करेगा। जब भी मैं इन तरह के नुकसान से बचने के लिए मैं Gson का उपयोग कर सकता हूं। यह मेरी राय में अशक्त मूल्यों को बेहतर तरीके से संभालता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.