2016-02-29 8 views
12

का प्रतिनिधित्व करने के लिए JSON में एक स्ट्रिंग का उपयोग क्यों करेंगे, paypal API जैसे कुछ API, दशमलव संख्या का प्रतिनिधित्व करने के लिए JSON में एक स्ट्रिंग प्रकार का उपयोग करें। के बजाय "7.47"आप दशमलव संख्या

जेसन नंबर वैल्यू प्रकार का उपयोग करने पर यह एक अच्छा विचार क्यों होगा? AFAIK संख्या मूल्य प्रकार अनंत परिशुद्धता के साथ-साथ वैज्ञानिक नोटेशन की अनुमति देता है।

+2

क्योंकि मुद्रा के लिए फ्लोट्स का उपयोग केवल सड़क के नीचे त्रुटियों का कारण बन जाएगा। फ्लोट वास्तविक दुनिया के मूल्यों जैसे कि पैसे की तरह प्रतिनिधित्व करने के लिए उपयोग योग्य नहीं हैं - भरोसेमंद नहीं, वैसे भी। जैसे 7.47 वास्तव में फ्लोट में परिवर्तित होने पर 7.469 99 99923423423423 हो सकता है। एक साधारण प्रणाली जो केवल अतिरिक्त अंकों को छीनती है, परिणामस्वरूप 7.46 होगी और अब आप कहीं एक पैसा खो चुके हैं ... सुपरमैन II (I?) के रंग। –

+2

@MarcB मैं परिचित हूं कि आप मुद्रा के लिए फ्लोट का उपयोग क्यों नहीं करेंगे, लेकिन क्या JSON संख्या वास्तव में एक फ्लोट है? जैसा कि मैं समझता हूं कि यह एक भाषा स्वतंत्र संख्या है, और यदि आप इच्छुक हैं तो किसी भी भाषा में किसी JSON संख्या को सीधे जावा 'बिगडेमियल' या अन्य मनमाने ढंग से सटीक प्रारूप में पार्स कर सकते हैं। – kag0

+0

इस बात पर निर्भर करता है कि पेपैल के सिस्टम में यह कैसे शुरू हुआ था। जेसन एक मोनोलिथिक टेक्स्ट स्ट्रिंग और जेएस डेटा स्ट्रक्चर के बीच 1: 1 मैपिंग है। यदि एक "संख्या" को जेसन स्ट्रिंग में '"..." स्ट्रिंग के रूप में संग्रहीत किया जाता है, तो यह मूल डेटा संरचना में स्ट्रिंग था, या कुछ जो स्ट्रिंग करने के लिए मैप करता था। –

उत्तर

14

जेएसओएन में संख्यात्मक मानों को स्थानांतरित करने का मुख्य कारण स्ट्रिंग के रूप में सटीकता या अस्पष्टता के किसी भी नुकसान को खत्म करना है।

यह सच है कि JSON spec संख्यात्मक मानों के लिए सटीकता निर्दिष्ट नहीं करता है। इसका मतलब यह नहीं है कि JSON संख्याओं में अनंत परिशुद्धता है। इसका मतलब है कि संख्यात्मक परिशुद्धता निर्दिष्ट नहीं है, जिसका अर्थ है कि जेएसओएन कार्यान्वयन उनके कार्यान्वयन या लक्ष्यों के लिए जो भी संख्यात्मक परिशुद्धता सुविधाजनक है, चुनने के लिए स्वतंत्र हैं। यह परिवर्तनशीलता है जो आपके दर्द में विशिष्ट परिशुद्धता आवश्यकताओं के साथ दर्द हो सकती है।

सटीकता का नुकसान आम तौर पर संख्यात्मक मान के JSON एन्कोडिंग में स्पष्ट नहीं है (1.7 अच्छा और संक्षिप्त है) लेकिन प्राप्त करने वाले अंत में JSON पार्सिंग और मध्यवर्ती प्रतिनिधित्व में प्रकट होता है। एक जेएसओएन पार्सिंग फ़ंक्शन एक आईईईई डबल परिशुद्धता फ्लोटिंग पॉइंट नंबर में काफी हद तक 1.7 पार्स करेगा। हालांकि, सीमित लंबाई/सीमित सटीक प्रतिनिधित्व हमेशा संख्याओं में चलेंगे जिन्हें सटीक रूप से प्रदर्शित नहीं किया जा सकता है। क्रांतिकारी संख्याओं (जैसे पीआई और ई) को किसी सीमित प्रणाली में कभी भी सटीक रूप से प्रदर्शित नहीं किया जा सकता है। 1.7 में दशमलव (बेस 10) नोटेशन में एक सीमित प्रतिनिधित्व है, लेकिन बाइनरी (बेस 2) में यह एक अपरिमेय संख्या है - अंकों की एक अनंत श्रृंखला।

तो, 1.7 को एक इन-मेमोरी फ्लोटिंग पॉइंट नंबर में पार्स करना, फिर संख्या को प्रिंट करना शायद 1.6 9 - 1.7 की तरह कुछ वापस नहीं करेगा।

JSON 1.7 मान के उपभोक्ता स्मृति में मूल्य को पार्स और बनाए रखने के लिए अधिक परिष्कृत तकनीकों का उपयोग कर सकते हैं, जैसे निश्चित बिंदु डेटा प्रकार या "स्ट्रिंग int" डेटा प्रकार का उपयोग मनमाने ढंग से सटीक के साथ, लेकिन यह पूरी तरह से नहीं होगा कुछ संख्याओं के लिए रूपांतरण में परिशुद्धता के नुकसान के दर्शक को खत्म करें। और वास्तविकता यह है कि बहुत कम जेएसओएन पार्सर्स इस तरह के चरम उपायों से परेशान हैं, क्योंकि ज्यादातर स्थितियों के लाभ कम हैं और स्मृति और सीपीयू लागत अधिक है।

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

उदाहरण के लिए: कुछ जेएसओएन उत्पादकों (जेआरबी, एक के लिए) में, बिगइंटर मूल्य स्वचालित रूप से जेएसओएन को तारों के रूप में आउटपुट करते हैं, मुख्य रूप से क्योंकि बिगइंटर की सीमा और सटीकता आईईईई डबल परिशुद्धता फ्लोट से बहुत बड़ी है। JSON संख्यात्मक के रूप में आउटपुट करने के लिए BigInteger मान को दोगुना करने के लिए अक्सर महत्वपूर्ण अंक खो देंगे।

इसके अलावा, JSON spec (http://www.json.org/) स्पष्ट रूप से बताता है कि NaNs और Infinities (INFs) JSON संख्यात्मक मानों के लिए अमान्य हैं। यदि आपको इन सीमा तत्वों को व्यक्त करने की आवश्यकता है, तो आप JSON संख्या का उपयोग नहीं कर सकते हैं। आपको एक स्ट्रिंग या ऑब्जेक्ट स्ट्रक्चर का उपयोग करना होगा।

अंत में, एक और पहलू है जो संख्यात्मक डेटा को तारों के रूप में भेजने का चयन कर सकता है: प्रदर्शन स्वरूपण का नियंत्रण। प्रमुख शून्य और पीछे वाले शून्य संख्यात्मक मूल्य के लिए महत्वहीन हैं। यदि आप आंतरिक संख्यात्मक रूप में रूपांतरण के बाद JSON संख्या मान 2.10 या 004 भेजते हैं तो उन्हें 2.1 और 4 के रूप में प्रदर्शित किया जाएगा।

यदि आप डेटा भेज रहे हैं जो सीधे उपयोगकर्ता को प्रदर्शित किया जाएगा, तो संभवतः आप अपने पैसे के आंकड़े स्क्रीन पर अच्छी तरह से लाइन करने के लिए चाहते हैं, दशमलव गठबंधन। ऐसा करने का एक तरीका क्लाइंट को प्रदर्शन के लिए डेटा स्वरूपित करने के लिए ज़िम्मेदार बनाना है। ऐसा करने का एक और तरीका यह है कि सर्वर प्रदर्शन के लिए डेटा स्वरूपित करता है। क्लाइंट के लिए शायद स्क्रीन पर सामान प्रदर्शित करने के लिए सरल, लेकिन यह स्ट्रिंग से संख्यात्मक मान निकालने में सक्षम हो सकता है यदि क्लाइंट को मूल्यों पर गणना करने की भी आवश्यकता होती है।

+0

तर्कहीन संख्याओं के महत्व को कम मत समझें - तर्कसंगत संख्याओं की तुलना में बहुत अधिक तर्कहीन संख्याएं हैं! दोनों अनंत सेट हैं, लेकिन irrationals का माप राशन के माप से अधिक है। अपने स्थानीय गणित प्रोफेसर से पूछें। कॉफी लाओ :> – dthorpe

+1

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

0

संक्षिप्त संस्करण

बस @ dthorpe के जवाब से उद्धृत, के रूप में मुझे लगता है कि यह सबसे महत्वपूर्ण बात है:

इसके अलावा, JSON कल्पना (http://www.json.org/) स्पष्ट रूप से कहा गया है कि Nans और Infinities (INFs) JSON संख्यात्मक मानों के लिए अमान्य हैं। यदि आपको इन सीमा तत्वों को व्यक्त करने की आवश्यकता है, तो आप JSON संख्या का उपयोग नहीं कर सकते हैं। आपको एक स्ट्रिंग या ऑब्जेक्ट स्ट्रक्चर का उपयोग करना होगा।

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