क्या JSON में शून्य मान शामिल हैं [बंद]


89

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

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

या

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

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


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

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

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

जवाबों:


32

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

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


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

केवल ऐसा मामला है जिसके बारे में मैं सोच सकता हूं कि यदि ब्राउज़र किसी निश्चित घटना प्रकार का समर्थन करता है। उदाहरण के लिए, if( typeof onbeforepaste == "undefined")यह देखने के लिए कि onBeforePasteक्या समर्थित है। तब भी इससे कोई वास्तविक अंतर नहीं पड़ता है क्योंकि आप उन सभी घटनाओं को असाइन कर सकते हैं जो आप चाहते हैं (वे केवल कुछ भी नहीं करेंगे यदि असमर्थित हैं)।
नीट द डार्क एबसोल

6
स्थानांतरित बाइट्स को बचाने के मामले में, अनुक्रमित सरणियों जैसी चीजों की तुलना में संपीड़न बहुत अधिक महत्वपूर्ण है। web-resource-optimization.blogspot.no/2011/06/… सुनिश्चित करें कि पहली बात यह है कि आप करते हैं। ज्यादातर मामलों में शीर्ष पर अनुक्रमित सरणियों जैसी चीजों को जोड़ना, जिसे मैं समय से पहले अनुकूलन कहूंगा। जब तक आप डेटा की बड़ी मात्रा भेज रहे हैं। इसके लिए अतिरिक्त पार्सिंग की भी आवश्यकता होती है, जिससे आपके ऐप में और जटिलता आ जाती है। Gzipping ब्राउज़र द्वारा मूल रूप से किया जाता है। (ग्राहक को एक ब्राउज़र मान लिया गया है)
मार्टिन हैनन

3
HTTPS दिन का आदर्श बनने के साथ (कम से कम बड़े यूजरबेस वाले ऐप्स के लिए), कम्प्रेशन टॉस के लिए जाता है। देखें en.wikipedia.org/wiki/CRIME_%28security_exploit%29
गौरव वैश्य

6
अगर वास्तव में मेरी प्रतिष्ठा थी, तो मैं वास्तव में -1 के लिए "शून्य के बीच अंतर करने की आवश्यकता नहीं है"। 2 कारणों में से: 1. अलग होने के कारण मौजूद हैं और वे दुर्लभ नहीं हैं। 2. सर्वोत्तम अभ्यास का हमेशा मान "अच्छी तरह से परिभाषित" होता है, जिसका अर्थ है कि हमेशा किसी भी अस्पष्टता को रोकें - 1 मूल्य के 2 अर्थ हमेशा बुरे होते हैं - यह बहुत स्पष्ट होना चाहिए ..
श्रीनेज़ेक

80

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

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

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

/* 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
वास्तव में, अधिक लोगों को "", अशक्त और अपरिभाषित के बीच के अंतर को समझने की आवश्यकता है। इस प्रश्न का उत्तर उपयोगकर्ताओं की आवश्यकताओं पर निर्भर है।
जे।

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

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

वास्तव में स्वीकृत उत्तर का पहला भाग इतना गलत है ...
सर्नेज़ेक

मैं "propertyName" in objectFromJSONइसके बजाय लिखूंगा objectFromJSON.hasOwnProperty("propertyName")। इसके अलावा, यदि आप उपयोग करने पर जोर देते हैं hasOwnPropertyतो Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")सुरक्षा के लिए लिखें ।
आदित एम शाह

22

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

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


5
JSON में कोई "अपरिभाषित" नहीं है, इसलिए मुझे लगता है कि वह केवल "खाली" गुणों को शामिल करने के लिए पूछता है या नहीं - {"prop":undefined}से अलग है {}
बर्गी

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

11

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

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


0

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

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


1
क्या आप प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर अपने जवाब को विस्तृत कर सकते हैं?
अबरिसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.