स्रोत की पंक्ति और मान की पंक्ति अलग हैं

JSON स्रोत की स्ट्रिंग में बैकस्लैश के बाद n नई पंक्ति दर्शाता है। दो बैकस्लैश से पार्स किए मान में बैकस्लैश और n दो अक्षर रहते हैं। दोनों उदाहरण वैध हैं, लेकिन text मान की लंबाई 3 और 4 है।

{"text":"A\nB"}
{"text":"A\\nB"}

JSON.parse('{"text":"A\\nB"}').text.length // 3
JSON.parse('{"text":"A\\\\nB"}').text.length // 4
A और B के बीच एक LF तथा बैकस्लैश और n की तुलना का चित्र
तय इनपुट चलाकर बनाया गया चित्र। संख्याएँ पार्स किए text मान की JavaScript length हैं, JSON फ़ाइल के बाइट नहीं।

स्ट्रिंग के भीतर वास्तविक लाइन ब्रेक त्रुटि है

RFC 8259 स्ट्रिंग में U+0000 से U+001F नियंत्रण अक्षरों को एस्केप करने को कहता है; वास्तविक LF भी इसमें आता है। टोकन के बीच LF, CR, टैब और स्पेस स्वीकार हैं। परीक्षण में स्ट्रिंग के भीतर वास्तविक LF अस्वीकार हुआ, जबकि कई पंक्तियों वाला ऑब्जेक्ट स्वीकार हुआ।

const invalid = '{"text":"A' + '\n' + 'B"}';
formatJSON(invalid); // throws

formatJSON('{\n"text":"AB"\n}'); // accepted

RFC 8259 §7: Strings · RFC 8259 §2: JSON Grammar

फ़ॉर्मैटिंग और मान की व्याख्या अलग रखें

Moyoutil स्रोत के स्ट्रिंग टोकन रखता है और बाहरी इंडेंट बदलता है। यह \n को मान के भीतर वास्तविक लाइन ब्रेक की तरह नहीं दिखाता। मिनिफ़ाई भी स्ट्रिंग एस्केप रखता है। त्रुटि हो तो बताए स्थान के पास उद्धरण और बैकस्लैश देखें। पूरे इनपुट में बैकस्लैश जोड़ना सही मान भी बदल सकता है।

उदाहरण डालकर फ़ॉर्मैट और सत्यापन चलाएँ, फिर मिनिफ़ाई परिणाम तुलना करें। मान में नई पंक्ति चाहिए तो JSON बनाते समय JSON.stringify से स्ट्रिंग सीरियलाइज़ करें और JSON.parse के मान की जाँच करें। सही सिंटैक्स किसी API स्कीमा के आवश्यक फ़ील्ड का सत्यापन नहीं है।

अक्सर पूछे जाने वाले प्रश्न

क्या JSON मिनिफ़ाई करने से मान की नई पंक्ति मिटती है?

नहीं। यह स्ट्रिंग के बाहर का खाली स्थान कम करता है। यह टूल स्ट्रिंग के एस्केप रखता है, इसलिए पार्स किए मान की नई पंक्ति बनी रहती है।