JSON पूर्णांक: आकार पर सीमा


81

क्या यह कहीं भी निर्दिष्ट है कि JSON पूर्णांक कितना बड़ा हो सकता है? मुझे लगता है कि वे सामान्य (32 बिट) ints तक सीमित हैं, लेकिन मुझे लगता है कि नीचे लिखा है कि कहीं भी नहीं मिल रहा हूँ। मुझे उन पहचानकर्ताओं को एनकोड करने की आवश्यकता है जो जावा में लंबे हैं, इसलिए मुझे लगता है कि मुझे JSON में स्ट्रिंग्स के रूप में संग्रहीत करने की आवश्यकता है ताकि अतिप्रवाह का जोखिम न हो।

जवाबों:


93

JSON नंबर युक्ति द्वारा सीमित नहीं है ।

JSON नंबर व्याकरण

चूंकि JSON एक अमूर्त प्रारूप है जो विशेष रूप से जावास्क्रिप्ट पर लक्षित नहीं है, वास्तविक लक्ष्य वातावरण व्याख्या की जाने वाली सीमाओं को निर्धारित करता है।

यह भी ध्यान देने योग्य है कि "JSON Integers" नहीं हैं, वे "संख्या" डेटाटाइप के उप-सेट हैं।


12
एक व्यावहारिक बात के रूप में, जावास्क्रिप्ट पूर्णांक लगभग 2 ^ 53 तक सीमित हैं (कोई पूर्णांक नहीं हैं; बस IEEE फ़्लोट्स)। लेकिन JSON कल्पना काफी स्पष्ट है कि JSON नंबर असीमित आकार के हैं।
नेल्सन

10
यद्यपि उत्तर तकनीकी रूप से सही है, यह अद्यतन करने योग्य होगा, क्योंकि RFC 7159 पूर्णांक को किस सीमा तक अंतर-योग्य माना जाना चाहिए, यह स्पष्ट करने में मदद करता है। (यानी [-(2**53)+1, (2**53)-1]।) यदि आप उस सीमा के बाहर काम कर रहे हैं, तो या तो स्ट्रिंग एन्कोडेड पूर्णांकों का उपयोग करें, या कार्यान्वयन को सटीक खोने की अपेक्षा करें।
टॉम क्रिस्टी 10

@TomChristie JSON कल्पना RFC7159 का कोई उल्लेख नहीं करती है।
टॉमालक

4
@Tomalak - ज़रूर - RFC7159 बाद (2014) के साथ आया। पहले से मौजूद कुछ विसंगतियों / धार के मामलों आदि को स्पष्ट करता है (जैसे कि काम करने योग्य संख्यात्मक सीमाओं के बारे में कोई उल्लेख नहीं है)
टॉम क्रिस्टी

2
Hm, RFC को विस्तार से पढ़ने पर, यह अभी भी संख्या को सीमित नहीं करता है। यह केवल संकेत देता है कि कई सिस्टम आंतरिक रूप से IEEE754 का उपयोग करते हैं और यह तथ्य रिसीवर द्वारा व्याख्या की जा सकती है पर व्यावहारिक सीमाएं डाल सकता है, जो कि जवाब में सभी ने कहा है।
टॉमालक

18

RFC 7159: जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) डेटा इंटरचेंज फॉर्मेट

यह विनिर्देश कार्यान्वयन की सीमा और स्वीकृत संख्या की सीमा को निर्धारित करने की अनुमति देता है। चूंकि आईईईई 754-2008 बाइनरी 64 (दोहरी परिशुद्धता) संख्याओं [आईईईई 754] को लागू करने वाले सॉफ्टवेयर आम तौर पर उपलब्ध हैं और व्यापक रूप से उपयोग किए जाते हैं, इसलिए इन्टॉलरेंस से अच्छा इंटरऑपरेबिलिटी प्राप्त की जा सकती है जो इन प्रदानों की तुलना में अधिक सटीक या सीमा की उम्मीद नहीं करते हैं, इस अर्थ में ये कार्यान्वयन JSON को अनुमानित करेंगे अपेक्षित सटीकता के भीतर संख्या। एक JSON नंबर जैसे कि 1E400 या 3.141592653589793238462643383279 संभावित इंटरऑपरेबिलिटी समस्याओं का संकेत दे सकता है, क्योंकि इससे पता चलता है कि इसे बनाने वाले सॉफ्टवेयर को संख्यात्मक परिमाण और सटीकता की व्यापक क्षमताओं की व्यापक क्षमता उपलब्ध होने की उम्मीद है।


'व्यापक रूप से उपलब्ध' कुछ अस्पष्ट भाषा है, आईएमओ। इस बीच, कुछ कार्यान्वयन (जैसे पायथन के मानक jsonमॉड्यूल) मनमाने ढंग से पूर्णांकों को पार्स करते हैं, यहां तक ​​कि 64 बिट (अंतर्निहित बाइनम) से भी परे।
टॉमस गैंडर

'व्यापक रूप से उपलब्ध' इतना अस्पष्ट नहीं है जब यह पहले कहा गया था कि IEEE754 'व्यापक रूप से उपयोग किया जाता है'।
जेसन वार्नर

8

मैंने अभी क्रोम (v.23 पर मैक) कंसोल का उपयोग करके निम्नलिखित अनुभवजन्य परीक्षण किया था:

> var j = JSON.parse("[999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999]")
undefined

> j[0]
1e+228

यदि JSON को HTTP से गुजारा जाता है, तो संख्या किसी भी स्थिति में जावा से स्ट्रिंग में परिवर्तित हो जाएगी और फिर समस्या केवल जावास्क्रिप्ट में हो सकती है।

से ECMAScript भाषा विशिष्टता 4.3.19 :

4.3.19 संख्या मान

डबल-सटीक 64-बिट बाइनरी प्रारूप IEEE 754 मूल्य के अनुरूप आदिम मान

नोट एक संख्या मान संख्या प्रकार का एक सदस्य है और एक संख्या का प्रत्यक्ष प्रतिनिधित्व है।

जो कि विकिपीडिया डबल-सटीक फ़्लोटिंग-पॉइंट प्रारूप में परिभाषित किया गया है ।


2
धन्यवाद। इस विशेष JSON संरचना को जावा में बैक-एंड वेब सेवा द्वारा सौंपा जा रहा है, इसलिए, @ Tomalak के उत्तर के बाद मुझे लगता है कि मुझे यह जांचने की आवश्यकता है कि मेरा सर्वर-साइड JSON लाइब्रेरी वास्तव में क्या कर रहा है।
इयान डिकिंसन

3
और, रिकॉर्ड के लिए, जैक्सन लंबे समय के पूर्णांक को JSON इनपुट में सही ढंग से जावा लॉन्ग में पार्स करता है।
इयान डिकिंसन

और रिकॉर्ड के लिए भी, जैक्सन ने जावा लॉन्ग को सही ढंग से उत्सर्जित किया, लेकिन कम से कम क्रोम-आधारित ब्राउज़र ने अंतिम 3 दशमलव को शून्य पर सेट किया, यानी संख्या की लंबाई सही है, लेकिन अंतिम 3 दशमलव हमेशा 000 पढ़ते हैं
जोहान्स जेंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.