JSON स्पेसिफिकेशन औपचारिक रूप से ऑब्जेक्ट में कुंजियों के क्रम को परिभाषित नहीं करता — {"a": 1, "b": 2} और {"b": 2, "a": 1} एक ही डेटा हैं। लेकिन व्यवहार में, कुंजी क्रम अक्सर लोगों और उस डेटा के साथ काम करने वाले टूल दोनों के लिए मायने रखता है।
कुंजियाँ क्यों सॉर्ट करें
- तुलना (diff)। अगर एक जैसे डेटा वाले दो JSON दस्तावेज़ों में कुंजी क्रम अलग हो, तो टेक्स्ट diff एक गलत अंतर दिखाएगा। सॉर्टिंग इस समस्या को खत्म करती है।
- निश्चित आउटपुट। अगर एक ही ऑब्जेक्ट को कई बार सीरियलाइज़ किया जाए (जैसे हैश या कैश कुंजी बनाने के लिए), तो सॉर्ट की गई कुंजियाँ हर बार एक जैसा नतीजा सुनिश्चित करती हैं।
- पठनीयता। अल्फाबेटिकली सॉर्ट किया गया ऑब्जेक्ट जल्दी देखने और किसी खास फ़ील्ड को खोजने में आसान होता है, खासकर बड़ी संरचनाओं में।
रिकर्सिव सॉर्टिंग
नतीजे को अनुमानित बनाने के लिए, सॉर्टिंग आमतौर पर रिकर्सिवली लागू की जाती है — न सिर्फ टॉप-लेवल कुंजियों पर, बल्कि किसी भी गहराई पर मौजूद सभी नेस्टेड ऑब्जेक्ट की कुंजियों पर भी। ऐरे में एलिमेंट्स का क्रम इससे नहीं बदलता, क्योंकि ऐरे के लिए एलिमेंट्स का क्रम डेटा का एक सार्थक हिस्सा है।
कब ज़रूरत नहीं
अगर JSON को केवल एक प्रोग्राम इस्तेमाल करता है (किसी इंसान या diff टूल के बजाय), तो कुंजियाँ सॉर्ट करने से आमतौर पर कोई व्यावहारिक फ़ायदा नहीं मिलता — पार्सर फ़ील्ड के क्रम की परवाह किए बिना ऑब्जेक्ट को एक जैसा पढ़ते हैं।
देवनागरी के लिए "अल्फाबेटिकल" क्रम एक अलग ही अवधारणा है
देवनागरी की अपनी पारंपरिक वर्णमाला व्यवस्था है — पहले स्वर (अ, आ, इ, ई...), फिर व्यंजन उनके उच्चारण स्थान के हिसाब से समूहों में (कवर्ग, चवर्ग, टवर्ग...) — जो लैटिन A-Z जैसी मनमानी क्रम-व्यवस्था से बिल्कुल अलग है। इसके ऊपर, किसी व्यंजन से जुड़ी मात्रा (जैसे कि "कि" में इ-मात्रा) एक अलग यूनिकोड कोडपॉइंट होती है जो कोडपॉइंट क्रम में मूल व्यंजन के आगे-पीछे बदल सकती है, इसलिए सीधा कोडपॉइंट-दर-कोडपॉइंट कम्पेरिज़न सही देवनागरी शब्दकोश-क्रम नहीं दे पाता — इसके लिए ICU जैसा locale-aware collation ज़रूरी होता है।
सॉर्टिंग और लोकल
सिर्फ़ लैटिन नहीं बल्कि अन्य लिपियों वाली कुंजियों की वर्णानुक्रमिक सॉर्टिंग इस पर निर्भर करती है कि कैरेक्टर्स की तुलना बाइट-दर-बाइट (Unicode code point) की जाती है या भाषा के नियमों को ध्यान में रखते हुए (locale-aware collation)। उदाहरण के लिए, code-point तुलना अल्फ़ाबेट चाहे जो भी हो, बड़े अक्षरों को छोटे अक्षरों से पहले रखती है, जबकि locale-aware सॉर्टिंग कुंजियों को अलग क्रम में रख सकती है।