2012-06-12 16 views
83

मैं एक एपीआई बना रहा हूं जो जेएसओएन के रूप में परिणाम देता है। क्या कोई वर्तमान सर्वोत्तम अभ्यास है कि क्या परिणाम में कुंजी शामिल होनी चाहिए जब मूल्य शून्य है? उदाहरण के लिए:क्या JSON में शून्य मान शामिल हैं

{ 
    "title":"Foo Bar", 
    "author":"Joe Blow", 
    "isbn":null 
} 

या

{ 
    "title":"Foo Bar", 
    "author":"Joe Blow" 
} 

के बाद से दूसरा छोटा होता है मैं इस शैली की ओर झुकाव रहा हूँ, लेकिन मुझे यकीन है कि अगर वहाँ एक पसंदीदा शैली है या नहीं नहीं कर रहा हूँ। एक ग्राहक परिप्रेक्ष्य से ऐसा लगता है कि दोनों शैलियों कार्यात्मक रूप से समकक्ष होंगे। प्रत्येक के लिए कोई पेशेवर या विपक्ष?

+5

यह सही ढंग से जवाब देना असंभव है। सही उत्तर आवेदन की आवश्यकताओं पर निर्भर करता है। ओपी ने बस उस उत्तर का चयन किया है जो उसकी आवश्यकताओं के अनुरूप है। यदि आपके एप्लिकेशन को यह जानने के बीच अंतर करने में सक्षम होना चाहिए कि "isbn" शून्य बनाम है या नहीं, तो "isbn" किसी अन्य कारण से सर्वर से नहीं भेजा गया है, तो आपको इसे शामिल करने की आवश्यकता है। – Jacob

+0

@ जैकोब हालांकि मैंने यह नहीं कहा, इस सवाल के साथ मेरा इरादा यह था कि प्रतिक्रिया का प्रतिनिधित्व करने वाला "पूर्ण" JSON वापस किया जा रहा था। जब कोई ग्राहक यह मान सकता है कि दो दृष्टिकोणों के बीच कोई कार्यात्मक अंतर नहीं लगता है।यदि एपीआई चुनिंदा कुंजी/मूल्य वापस नहीं करेगा तो हां यह एक बड़ा अंतर करेगा जिससे दृष्टिकोण लिया गया था। – jjathman

+0

पहले प्रतिनिधित्व का लाभ यह है कि ऑब्जेक्ट स्कीमा संरक्षित है, संपत्ति की उपस्थिति डेटा के आधार पर संदिग्ध नहीं है। दूसरे प्रारूप में यह जानकारी खो गई है। जेएसओएन स्पेक के रूप में प्रारूप को अनिवार्य नहीं है AFAIK –

उत्तर

30

दूसरा बैंडविड्थ पर एक छोटी राशि बचाएगा, लेकिन यदि यह चिंता का विषय था तो आप JSON को कुंजी के साथ भरने के बजाय अनुक्रमित सरणी का भी उपयोग करेंगे। स्पष्ट रूप से, ["Foo Bar","Joe Blow"] अब आपके पास जितना छोटा है उससे कम है।

उपयोगिता के मामले में, मुझे नहीं लगता कि इससे कोई फर्क पड़ता है। दोनों मामलों में, if(json.isbn)else पर जायेगा। आमतौर पर null (कोई मूल्य नहीं) और undefined (कोई दिया गया मान) के बीच अंतर करने की आवश्यकता नहीं है।

+7

+1 * आमतौर पर शून्य (कोई मान नहीं) और अपरिभाषित (कोई मान नहीं दिया गया) के बीच अंतर करने की आवश्यकता नहीं है। * इसके लिए एक आसान ऑपरेटर भी है! = Null' (गैर-सख्त इरादा) – Esailija

+0

एकमात्र मामला यदि कोई ब्राउज़र किसी निश्चित ईवेंट प्रकार का समर्थन करता है तो मैं सोच सकता हूं कि परीक्षण किया जाएगा। उदाहरण के लिए, 'अगर (ऑनफॉर्पस्टेस्ट == "अपरिभाषित" टाइप करें) यह देखने के लिए कि' ऑनबॉर्नपेस्ट 'समर्थित है या नहीं। फिर भी इससे कोई वास्तविक अंतर नहीं होता है क्योंकि आप जो भी चाहते हैं उसे आवंटित कर सकते हैं (अगर असमर्थित हैं तो वे कुछ भी नहीं करेंगे)। –

+0

उस स्थिति में मैं संपत्ति के अस्तित्व का परीक्षण करने के लिए दस्तावेज़ में 'ऑनबेनपेस्ट "का परीक्षण करूंगा। – Esailija

19

जावास्क्रिप्ट में, null का अर्थ undefined से बहुत अलग है।

आपके JSON आउटपुट को JSON डेटा का उपयोग करने के विशिष्ट संदर्भ में आपके एप्लिकेशन द्वारा उपयोग और आवश्यकतानुसार प्रतिबिंबित करना चाहिए।

+4

JSON में कोई "अपरिभाषित" नहीं है, इसलिए मुझे लगता है कि वह केवल "खाली" गुणों को शामिल करना है या नहीं - '{" prop ": अपरिभाषित}' { } '। – Bergi

+0

सहमत हैं, मैं यह समझाने की कोशिश कर रहा हूं कि प्राप्त करने वाले अंत में, यदि वह एक विशिष्ट संपत्ति को शून्य पर सेट करने की तलाश में है, तो यह नहीं होगा। अगर छोड़ा गया तो यह अनिर्धारित होगा। – Brad

10

null और undefined के बीच अंतर करने की आवश्यकता होने पर आपको निश्चित रूप से इसे शामिल करना चाहिए क्योंकि उनके पास जावास्क्रिप्ट में दो अलग-अलग अर्थ हैं। आप null के बारे में सोच सकते हैं क्योंकि संपत्ति अज्ञात या अर्थहीन है, और undefined जिसका अर्थ है कि संपत्ति मौजूद नहीं है।

दूसरी तरफ, अगर किसी को भी उस भेद को बनाने की आवश्यकता नहीं है तो आगे बढ़ें और इसे छोड़ दें।

71

मैं हमेशा स्पष्ट रूप से शून्य के प्रशंसक हूं क्योंकि इसका अर्थ है। एक संपत्ति को छोड़कर अस्पष्टता छोड़ देता है।

जब तक उपर्युक्त में से कोई भी सर्वर पर आपका प्रोटोकॉल सहमत हो, तब तक काम कर सकता है, लेकिन यदि आप सर्वर से नल पास करते हैं तो मेरा मानना ​​है कि बाद में आपके एपीआई अधिक लचीले होते हैं।

यह भी उल्लेख करना चाहिए कि जावास्क्रिप्ट के हैऑनप्रॉपर्टी फ़ंक्शन आपको और अंतर्दृष्टि प्रदान करता है।

/* if true object DOES contain the property with *some* value */ 
if(objectFromJSON.hasOwnProperty("propertyName")) 

/* if true object DOES contain the property and it has been set to null */ 
if(jsonObject.propertyName === null) 

/* if true object either DOES NOT contain the property 
    OR 
    object DOES contain the property and it has been set to undefined */ 
if(jsonObject.propertyName === undefined) 
+3

बिल्कुल, अधिक लोगों को "", शून्य, और अपरिभाषित के बीच के अंतर को समझने की आवश्यकता है। इस प्रश्न का उत्तर उपयोगकर्ताओं की आवश्यकताओं पर निर्भर है। – Jacob

+11

+1। दूसरे छोर पर व्यक्ति (जिसने कोड लिखा था) स्पष्ट मूल्यों द्वारा बेहतर सेवा प्रदान की जाएगी। वे जावास्क्रिप्ट नहीं लिख रहे हैं ;-) – Steve11235

+2

ध्यान दें कि शून्य के खिलाफ जांच == के साथ काम नहीं करती है, === आवश्यक है (क्योंकि अपरिभाषित == शून्य)! – Tommy

0

मुझे लगता है कि जब आप JSON का उपयोग उपयोगकर्ता के अनुभव के पीछे डेटा के रूप में करते हैं तो यह कोई फर्क नहीं पड़ता।

अंतर JSON-config फ़ाइलों में दिखाई देता है, जब उपयोगकर्ता को हाथ से कुछ संपादित करना चाहिए। जब आप पहले उदाहरण का उपयोग करते हैं तो आप उपयोगकर्ता को कॉन्फ़िगरेशन के बारे में कुछ संकेत देते हैं।

+1

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

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