2013-08-14 7 views
39

मैं एक एंड्रॉइड ऐप विकसित कर रहा हूं जो सर्वर संचार के लिए JSON का उपयोग करता है और जब मैं अपनी जेसन फ़ाइल को पार्स करने की कोशिश कर रहा हूं तो मुझे एक अजीब समस्या है।JSON jsonObject.optString() स्ट्रिंग "शून्य"

यह मेरा पता Json-वस्तु पर String city = address.optString("city", "") फोन करके सर्वर

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

मैं शहर के लिए मूल्य मिल रहा है से मेरी json है। इस स्थिति के लिए मुझे खाली होने के लिए city की उम्मीद है (यही वह विकल्प है जो ऑप्टस्टिंग यहां है?) लेकिन वास्तव में इसमें स्ट्रिंग "नल" है। तो आगे शून्य- या है लक्षण-जांच झूठी वापसी होगी क्योंकि स्ट्रिंग में टेक्स्ट होता है। अगर मैं address.isNull("city") पर कॉल करता हूं तो यह सही होता है जो सही है। केवल optString विफल रहता है।

मुझे इस समस्या के लिए Google या Stackoverflow पर कुछ भी नहीं मिला। मैं वास्तव में नहीं समझता कि यह कैसे हो सकता है क्योंकि मैंने सोचा था कि optString वही करेगा जो मैंने अपेक्षित किया था। किसी को पता है कि यहाँ क्या गलत हो रहा है?

+2

'null' जावा (और हर दूसरी प्रोग्रामिंग भाषा मुझे पता है) में एक स्ट्रिंग के लिए मान्य मान है, इसलिए यह समझ में आता है कि यह फॉलबैक नहीं चुनता है, अगर यह कुंजी मौजूद नहीं है, तो यह फॉलबैक लेगा – x4rf41

+0

धन्यवाद। यह _optString_ से अपेक्षित व्यवहार नहीं है लेकिन ऐसा लगता है कि डेवलपर के मन में कुछ अलग था। खुद से जांच करना है। – joshplusa

उत्तर

72

आप इस समस्या में चल रहा है और अपने सिर खरोंच, सोच में अकेले नहीं हो "वे वास्तव में यह मतलब सकता है?" एओएसपी मुद्दे के मुताबिक, Google इंजीनियरों इसे एक बग पर विचार करें, लेकिन उन्हें org.json कार्यान्वयन, यहां तक ​​कि बग-संगत के साथ संगत होना था।

यदि आप इसके बारे में सोचते हैं, तो यह समझ में आता है, क्योंकि यदि एक ही कोड जो अन्य जावा वातावरण में चलने वाले समान पुस्तकालयों का उपयोग करता है, तो एंड्रॉइड में अलग-अलग व्यवहार करता है, तीसरे पक्ष के पुस्तकालयों का उपयोग करते समय बड़ी संगतता समस्याएं होती हैं। यहां तक ​​कि अगर इरादे अच्छे थे और यह वास्तव में बग तय करता है, तो यह कीड़े का एक नया नया खुल जाएगा।

AOSP issue के अनुसार:

व्यवहार जानबूझकर है, हम org.json के साथ बग-संगत होने के हमारे रास्ते से बाहर चले गए। अब यह तय है, यह अस्पष्ट है कि हमें अपने कोड को भी ठीक करना चाहिए या नहीं। आवेदन इस छोटी गाड़ी व्यवहार पर भरोसा कर सकते हैं।

यदि यह आपको दुःख पैदा कर रहा है, तो मैं आपको json.isNull() जैसे शून्य के परीक्षण के लिए एक अलग तंत्र का उपयोग करके कामकाज की सलाह देता हूं।

यहाँ आप मदद करने के लिए एक सरल विधि है:

/** 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); 
} 
+0

क्यों 'json.optString (कुंजी, null)' कॉल करें और न केवल 'json.getString (key)' आपकी कस्टम विधि? –

+0

सहायक विकल्प 'optString'' getString' के लिए एक प्रतिस्थापन नहीं है। 'opt' का अर्थ _optional_ है और यदि कुंजी मौजूद नहीं है तो अपवाद नहीं फेंक देगा। –

22

आप मूल रूप से 2 विकल्प हैं:

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

:

1) शून्य मान

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

साथ एक JSON पेलोड भेजें आप शून्य मान के लिए जाँच करें और उन्हें तदनुसार पार्स करने के लिए होगा 2) कुंजियों को शून्य मानों के साथ न भेजें और सीधे ऑप्टस्ट्रिंग (कुंजी, शून्य) का उपयोग करें (आपको बैंडविड्थ को सहेजना चाहिए)।

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

json.isNull (कुंजी) के लिए +1, कारण अगर (json.get (key) == null) ठीक से काम नहीं कर रहा है –

+0

आज़माएं (json.get (key) .equals ("null)) यह होगा काम – DevAndroid

+1

सावधान रहें: यदि कुंजी नहीं मिली है तो json.optString (कुंजी) एक खाली स्ट्रिंग वापस कर देगा। –

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

}

वहाँ कुंजी शब्द के साथ json अशक्त की जाँच के लिए है।

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

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

अपने IsNull() के साथ

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

पहला चेक का उपयोग shoud .... अगर नहीं कर सकते काम तो शून्य मान की जाँच करने के belows

कोशिश करते हैं और यह भी आप JSONObject.NULL ...

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

और अपने मामले में भी जांच

resultObject.getString("username").trim().eqauls("null") 

आप पहली बार 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;     
    } 
0

तो कुंजी के लिए मानों रिक्त है जाने की तरह नीचे

{

"स्थिति": 200,

"message": "",

"डाटा": {

"totalFare": null, 

},

} के साथ

जांच "IsNull", उदाहरण के लिए:

स्ट्रिंग strTotalFare;

अगर (objResponse.isNull ("totalFare"))

{

strTotalFare = "0";

} else {

strTotalFare = objResponse.getString ("totalFare");

}

यदि मान, कुंजी "totalFare" के लिए "शून्य" है ऊपर समारोह में अगर दर्ज करें और मूल्य किसी और शून्य आवंटित करेगा यह कुंजी से वास्तविक मूल्य मिल जाएगा।

0

मैट क्विली के उत्तर के आधार पर उत्तर का उपयोग करना, यदि आप कोटलिन और जावा में लिखे गए फ़ॉलबैक हिस्से सहित ऑप्टस्ट्रिंग की पूर्ण कार्यक्षमता की नकल करना चाहते हैं तो कोड यहां दिया गया है।

Kotlin:

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

जावा:

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

सीधे शब्दों में वापस आने पैरामीटर के लिए अशक्त में पारित अगर आप वापस आने की जरूरत नहीं है।

संबंधित मुद्दे