JSON में शून्य का प्रतिनिधित्व करना


422

JSON में शून्य मान लौटाने के लिए पसंदीदा तरीका क्या है? क्या आदिम लोगों के लिए एक अलग प्राथमिकता है?

उदाहरण के लिए, यदि सर्वर पर मेरी वस्तु का कोई मान नहीं के साथ "myCount" नामक पूर्णांक है, तो उस मान के लिए सबसे सही JSON होगा:

{}

या

{
    "myCount": null
}

या

{
    "myCount": 0
}

स्ट्रिंग्स के लिए एक ही सवाल - अगर मेरे पास सर्वर पर एक अशक्त स्ट्रिंग "myString" है, तो सबसे अच्छा JSON है:

{}

या

{
    "myString": null
}

या

{
    "myString": ""
}

या (भगवान मेरी मदद करो)

{
    "myString": "null"
}

मुझे JSON में एक खाली संग्रह http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html के रूप में प्रतिनिधित्व करने के लिए सम्मेलन पसंद है

एक खाली एरे का प्रतिनिधित्व किया जाएगा:

{
    "myArray": []
}

EDIT सारांश

'व्यक्तिगत वरीयता' तर्क यथार्थवादी लगता है, लेकिन उस पर संक्षिप्त दृष्टि डाली जाती है, एक समुदाय के रूप में हम असमान सेवाओं / स्रोतों की एक बड़ी संख्या का उपभोग करेंगे। JSON संरचना के लिए कन्वेंशन खपत और सामान्य सेवाओं के पुन: उपयोग को सामान्य बनाने में मदद करेंगे। जहाँ तक एक मानक स्थापित करने की बात है, मैं कुछ अपवादों के साथ जैक्सन सम्मेलनों में से अधिकांश को अपनाने का सुझाव दूंगा:

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

यदि आप ज्यादातर शून्य मानों के साथ एक JSON ऑब्जेक्ट लौटा रहे हैं, तो आपके पास कई सेवाओं में शामिल होने के लिए एक उम्मीदवार हो सकता है।

{

    "value1": null,

    "value2": null,

    "text1": null,

    "text2": "hello",

    "intValue": 0, //use primitive only if you are absolutely sure the answer is 0

    "myList": [],

    "myEmptyList": null, //NOT BEST PRACTICE - return [] instead

    "boolean1": null, //use primitive only if you are absolutely sure the answer is true/false

    "littleboolean": false

}

उपरोक्त JSON निम्न जावा वर्ग से उत्पन्न हुआ था।

package jackson;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonApp {

    public static class Data {

        public Integer value1;

        public Integer value2;

        public String text1;

        public String text2 = "hello";

        public int intValue;

        public List<Object> myList = new ArrayList<Object>();

        public List<Object> myEmptyList;

        public Boolean boolean1;

        public boolean littleboolean;

    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(new Data()));
    }
}

मावेन निर्भरता:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.3.0</version>
</dependency>

5
कोई सबसे अच्छा तरीका नहीं है। अपने कंक्रीट उपयोग के मामले में ग्राहक के लिए उपभोग करने के लिए सबसे आसान तरीका चुनें। इसके बजाय खाली संग्रह वापस करने की भावना में null, विचार करें कि क्या आपका ग्राहक खाली स्ट्रिंग के साथ बेहतर है या null- "अशक्त" शब्द से युक्त एक स्ट्रिंग एक मान्य मूल्य से अप्रभेद्य है, ऐसा मत करो।
फिलिप रीचर्ट

3
0 या एक रिक्त स्ट्रिंग बहुत अच्छी तरह से अशक्त से अलग अर्थ हो सकता है, जो कि मौजूद विशेषता से अलग अर्थ हो सकता है। यदि आप अशक्त का प्रतिनिधित्व करना चाहते हैं, तो अशक्त का उपयोग करें। यह सबसे स्पष्ट है।
जॉन शीहान

ऑब्जेक्टिव-सी में एक परिभाषित NSNullवर्ग है जिसमें एक एकल उदाहरण है। उस उदाहरण का एक संदर्भ JSON के बराबर है null। मुझे लगता है कि दूसरी भाषा भी यही काम कर सकती है। बेशक, किसी को प्रकल्पित वर्ग को कास्टिंग करने से पहले प्राप्त वस्तु की कक्षा की जांच करनी होगी - जैसा कि "अशक्त" था।
हॉट लिक्स

2
ध्यान दें कि एक "अशक्त" सूची जावा में सबसे अच्छा अभ्यास नहीं है: यदि सूची खाली होने की उम्मीद है, तो इसे एक खाली सूची पर प्रारंभ करें। यह करने के लिए आवश्यक है, तो रहने के खाली (जैसे, क्योंकि यह बजाय एक नई सूची से थोक बदल दिया जाएगा मान जोड़ने के लिए संशोधित), यह आरंभ करने के लिए खाली सूची (यानी )। ऐसा करने से अशक्त संदर्भ कीड़े से बचा जाता है जो अन्यथा दर्द हो सकता है। Collections.emptyList()
पेरियाटा ब्रीटा

@HotLicks - यह केवल इसलिए संभव है क्योंकि ऑब्जेक्टिव-सी गतिशील रूप से टाइप किया गया है। उदाहरण के लिए, जावा में, आपके पास एक (उपयोगी) Nullवर्ग नहीं हो सकता है क्योंकि आप केवल इसके प्रकार या इसके प्रकार की वस्तुओं को इसके मूल्यों को निर्दिष्ट करने में सक्षम होंगे Object
पेरिआटा ब्रीटाटा

जवाबों:


378

आइए प्रत्येक के पार्सिंग का मूल्यांकन करें:

http://jsfiddle.net/brandonscript/Y2dGv/

var json1 = '{}';
var json2 = '{"myCount": null}';
var json3 = '{"myCount": 0}';
var json4 = '{"myString": ""}';
var json5 = '{"myString": "null"}';
var json6 = '{"myArray": []}';

console.log(JSON.parse(json1)); // {}
console.log(JSON.parse(json2)); // {myCount: null}
console.log(JSON.parse(json3)); // {myCount: 0}
console.log(JSON.parse(json4)); // {myString: ""}
console.log(JSON.parse(json5)); // {myString: "null"}
console.log(JSON.parse(json6)); // {myArray: []}

Tl; डॉ यहाँ:

Json2 चर में टुकड़ा जिस तरह से JSON युक्ति इंगित करता है, nullउसका प्रतिनिधित्व किया जाना चाहिए। लेकिन हमेशा की तरह, यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं - कभी-कभी ऐसा करने का "सही" तरीका हमेशा आपकी स्थिति के लिए काम नहीं करता है। अपने निर्णय का उपयोग करें और एक सूचित निर्णय लें।


JSON1 {}

यह एक खाली वस्तु देता है। वहाँ कोई डेटा नहीं है, और यह केवल आपको यह बताने जा रहा है कि जो भी कुंजी आप देख रहे हैं (यह myCountया कुछ और हो) प्रकार की है undefined


JSON2 {"myCount": null}

इस मामले में, myCountवास्तव में परिभाषित किया गया है, यद्यपि इसका मूल्य है null। यह वह जगह है नहीं दोनों के रूप में "नहीं एक ही undefinedहै और नहीं null", और यदि आप एक शर्त या अन्य के लिए परीक्षण किया गया है, यह सफल हो सकता है, जबकि JSON1 विफल हो जाएगा।

यह JSON युक्ति केnull अनुसार प्रतिनिधित्व करने का निश्चित तरीका है ।


JSON3 {"myCount": 0}

इस मामले में, myCount 0. है जो कि समान नहीं है null, और यह जैसा है वैसा नहीं है false। यदि आपका सशर्त कथन मूल्यांकन करता है myCount > 0, तो यह आपके लिए सार्थक हो सकता है। इसके अलावा, यदि आप यहां मूल्य के आधार पर गणना चला रहे हैं, तो 0 उपयोगी हो सकता है। यदि आप इसके लिए परीक्षण करने का प्रयास कर रहे हैं null, तो यह वास्तव में बिल्कुल काम नहीं करेगा।


JSON4 {"myString": ""}

इस स्थिति में, आपको एक खाली स्ट्रिंग मिल रही है। फिर से, JSON2 के साथ के रूप में, यह परिभाषित है, लेकिन यह खाली है। आप के लिए परीक्षण if (obj.myString == "")कर सकते हैं लेकिन आप के लिए परीक्षण नहीं कर सकता है nullया नहीं undefined


JSON5 {"myString": "null"}

यह संभवतः आपको परेशानी में डालने वाला है, क्योंकि आप स्ट्रिंग मान को शून्य करने के लिए सेट कर रहे हैं ; इस मामले में, obj.myString == "null"हालांकि यह नहीं है == null


JSON6 {"myArray": []}

यह आपको बताएगा कि आपकी सरणी myArrayमौजूद है, लेकिन यह खाली है। यदि आप एक गणना या मूल्यांकन करने की कोशिश कर रहे हैं तो यह उपयोगी है myArray। उदाहरण के लिए, मान लें कि आप पोस्ट किए गए फ़ोटो की संख्या का मूल्यांकन करना चाहते हैं - आप कर सकते हैं myArray.lengthऔर यह वापस आ जाएगी 0: परिभाषित, लेकिन कोई फ़ोटो पोस्ट नहीं की गई।


1
बहुत बहुत धन्यवाद, बहुत मददगार। बस एक छोटा सा पक्ष नोड; जब प्ले Json (स्केला) विकल्प को धारावाहिक [स्ट्रिंग] = कोई नतीजा है JSON1यानी{}
नील

207

nullशून्य नहीं है। यह मान नहीं है, प्रति se : यह चर के डोमेन के बाहर का एक मूल्य है जो लापता या अज्ञात डेटा का संकेत देता है।

nullJSON में प्रतिनिधित्व करने का केवल एक ही तरीका है । ऐनक प्रति ( RFC 4627 और json.org ):

2.1। मान

एक JSON मूल्य एक वस्तु, सरणी, संख्या, या स्ट्रिंग, या में से एक होना चाहिए
निम्नलिखित तीन शाब्दिक नाम:

  झूठे सच

यहां छवि विवरण दर्ज करें


8
यह ऐसी शर्म की बात है कि अशक्त को उपस्थित होना पड़ता है। कुछ नहीं के लिए 4 वर्ण। अच्छा होगा कि आप केवल मूल्य को पूरी तरह से बाहर कर दें। json = '{"myValue":}';
रिचर्ड ए क्वॉडलिंग

119
@ रिचर्ड ए क्वाडलिंग - मैं हैल एबेल्सन के अनुयायियों के "कार्यक्रम लोगों को पढ़ने के लिए लिखा जाना चाहिए, और केवल संयोगवश मशीनों को निष्पादित करने के लिए लिखा जाना चाहिए"। मैं प्रोग्रामर के इरादे की पुष्टि करते हुए 'null' शब्द पसंद करूंगा, न कि सिर्फ आकस्मिक चूक का सवाल।
स्कॉट स्मिथ

13
@ मई: "JSON मान प्रोग्राम नहीं हैं" - मेरी बात असंदिग्ध रूप से मंशा को इंगित करने के बारे में है। हां, इसमें एक अतिरिक्त चार अक्षर हैं, और कुछ अनुप्रयोगों के लिए यह अंतर महत्वपूर्ण हो सकता है। हालांकि कई मामलों में, गलतियाँ करने के लाभ मामूली अनुकूलन के लाभों को गलत मानते हैं।
स्कॉट स्मिथ

11
@ इसके अलावा, json.org के अनुसार, JSON "मनुष्यों के लिए पढ़ना और लिखना आसान है।"
सोफिवोरस

14
यह भी ध्यान दें कि यदि आपको 4 ASCII वर्णों की समस्या है, तो JSON सबसे अच्छा तरीका नहीं है, बाइनरी JSON को देखें या शुद्ध बाइनरी प्रारूप को बेहतर बनाएं
फोनिक्स

26

प्रतिनिधित्व करने का केवल एक ही तरीका है null; वह साथ है null

console.log(null === null);   // true
console.log(null === true);   // false
console.log(null === false);  // false
console.log(null === 'null'); // false
console.log(null === "null"); // false
console.log(null === "");     // false
console.log(null === []);     // false
console.log(null === 0);      // false

यानी; यदि आपके JSON प्रतिनिधित्व का उपभोग करने वाला कोई भी ग्राहक ===ऑपरेटर का उपयोग करता है; यह उनके लिए एक समस्या हो सकती है।

कोई मूल्य नहीं

यदि आप यह बताना चाहते हैं कि आपके पास एक ऐसी वस्तु है जिसकी विशेषता myCountका कोई मूल्य नहीं है:

{ "myCount": null }

कोई विशेषता / लापता विशेषता नहीं

क्या होगा यदि आप बताएं कि आपके पास कोई विशेषता नहीं है:

{}

ग्राहक कोड का उपयोग करने myCountऔर प्राप्त करने की कोशिश करेंगे undefined; यह वहाँ नहीं है।

खाली संग्रह

क्या होगा यदि आप बताएं कि आपके पास एक विशेषता myCountहै जो एक खाली सूची है:

{ "myCount": [] }

तुलना के साथ +1 अच्छे उदाहरण हैं, लेकिन यह जावास्क्रिप्ट और json के बीच अंतर करने में मददगार होगा, जिसका अर्थ है, जावास्क्रिप्ट में नल के प्रतिनिधित्व को json's से मेल नहीं खाना था (हालांकि यह करता है)।
म्लादेन बी।

15

मैं यह nullदिखाने के लिए उपयोग करूंगा कि उस विशेष कुंजी का कोई मूल्य नहीं है। उदाहरण के लिए, nullयह दर्शाने के लिए उपयोग करें कि "आपके घर में डिवाइस की संख्या इंटरनेट से जुड़ती है" अज्ञात है।

दूसरी ओर, उपयोग करें {}यदि वह विशेष कुंजी लागू नहीं है। उदाहरण के लिए, आपको एक गिनती नहीं दिखानी चाहिए, भले ही null, "उन कारों की संख्या, जिनके पास सक्रिय इंटरनेट कनेक्शन है" को किसी ऐसे व्यक्ति से पूछा जाता है जिसके पास कोई कार नहीं है।

जब तक कि डिफ़ॉल्ट समझ में नहीं आता मैं किसी भी मूल्य को डिफ़ॉल्ट करने से बचूंगा। हालांकि आप nullबिना किसी मूल्य का प्रतिनिधित्व करने के लिए उपयोग करने का निर्णय ले सकते हैं , निश्चित रूप "null"से ऐसा करने के लिए कभी भी उपयोग न करें ।


7

मैं डेटा प्रकार के चर ( संख्याओं के लिए null/ ऑब्जेक्ट्स के 0लिए) के लिए "डिफ़ॉल्ट" चुनूंगा , लेकिन वास्तव में जाँचें कि कौन सा कोड ऑब्जेक्ट का उपभोग करेगा। मत भूलो कि वहाँ कभी-कभी null/ डिफ़ॉल्ट बनाम "मौजूद नहीं" के बीच अंतर होता है ।

की जाँच करें अशक्त वस्तु पैटर्न - कभी यह करने के बजाय कुछ विशेष वस्तु पारित करने के लिए बेहतर है null(यानी []सरणी के बजाय nullसरणियों के लिए या ""तार के लिए)।


2

यह एक व्यक्तिगत और स्थितिजन्य विकल्प है। याद रखने वाली महत्वपूर्ण बात यह है कि खाली स्ट्रिंग और संख्या शून्य, वैचारिक रूप से अलग हैं null

आप के मामले में countशायद हमेशा कुछ वैध संख्या चाहते हैं (जब तक कि countअज्ञात या अपरिभाषित न हो), लेकिन तार के मामले में, कौन जानता है? खाली स्ट्रिंग आपके आवेदन में कुछ अर्थ दे सकती है । या शायद यह नहीं है। यह आपको तय करना है।


1

JSON कल्पना के अनुसार , बाहरी कंटेनर में एक शब्दकोष (या 'ऑब्जेक्ट') होना आवश्यक नहीं है जैसा कि ऊपर की अधिकांश टिप्पणियों में निहित है। यह एक सूची या एक नंगे मूल्य (यानी स्ट्रिंग, संख्या, बूलियन या अशक्त) भी हो सकता है। यदि आप JSON में एक शून्य मान का प्रतिनिधित्व करना चाहते हैं, तो संपूर्ण JSON स्ट्रिंग (JSON स्ट्रिंग युक्त उद्धरणों को छोड़कर) बस है null। कोई ब्रेसिज़ नहीं, कोई कोष्ठक नहीं, कोई उद्धरण नहीं। आप एक ऐसे शब्दकोश को निर्दिष्ट कर सकते हैं जिसमें एक शून्य मान ( {"key1":null}), या एक शून्य मान के साथ एक सूची है ( [null]), लेकिन ये स्वयं शून्य मान नहीं हैं - वे उचित शब्दकोश और सूचियां हैं। इसी तरह, एक खाली शब्दकोश ( {}) या एक खाली सूची ( []) पूरी तरह से ठीक है, लेकिन या तो अशक्त नहीं हैं।

पायथन में:

>>> print json.loads('{"key1":null}')
{u'key1': None}
>>> print json.loads('[null]')
[None]
>>> print json.loads('[]')
[]
>>> print json.loads('{}')
{}
>>> print json.loads('null')
None

ध्यान दें कि यह लिंक किए गए JSON स्पेक पेज के दाहिने साइडबार पर McKeeman फॉर्म व्याकरण है, जो कि नंगे होने की पुष्टि करता है null वैध JSON का गठन करता है। मुख्य बॉडी टेक्स्ट और चित्र अस्पष्ट हैं और यदि कुछ भी प्रतीत होता है कि केवल ऑब्जेक्ट और एरेज़ रूट पर मान्य हैं।
योयॉयोसेफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.