JSON डिफ़

दो JSON दस्तावेज़ों की तुलना पंक्ति के बजाय संरचना से करें। जोड़े गए, हटाए गए और बदले गए पथ रिपोर्ट करता है, साथ में ऐरे क्रम को अनदेखा करने का विकल्प। पूरी तरह आपके ब्राउज़र में चलता है।

संरचना से तुलना करें, पंक्ति से नहीं। दो दस्तावेज़ पेस्ट करें और यह रिपोर्ट पाएँ कि क्या जोड़ा गया, हटाया गया या बदला गया, पथ-दर-पथ। चूँकि तुलना पार्स किए गए मानों पर चलती है, पुनः स्वरूपण या कुंजी पुनर्क्रमण अंतर के रूप में प्रकट नहीं होता।

अंतर

JSON के लिए टेक्स्ट डिफ़ गलत उपकरण क्यों है

लाइन डिफ़ स्वरूपण देखते हैं, अर्थ नहीं

एक मानक पंक्ति-आधारित डिफ़ JSON को गद्य मानता है। किसी फ़ाइल को दो स्पेस से चार स्पेस में पुनः इंडेंट करें और हर पंक्ति परिवर्तित चिह्नित होती है। किसी कुंजी को ऑब्जेक्ट के शीर्ष से तल तक ले जाएँ और आपको एक हटाना प्लस एक डालना मिलता है, भले ही पार्स किया गया मान बिल्कुल वही हो। किसी लंबे ऐरे को एकल पंक्ति पर लपेटें और पूरा ब्लॉक जल उठता है।

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

पथ, पंक्ति संख्याएँ नहीं

यहाँ प्रत्येक अंतर किसी पथ के विरुद्ध रिपोर्ट होता है जैसे user.roles[2] या meta.updated। एक पथ दस्तावेज़ में कहीं और किए गए संपादनों से बच जाता है, जो एक पंक्ति संख्या नहीं करती, इसलिए आप उसी रिपोर्ट को किसी टिकट या कोड समीक्षा में पेस्ट कर सकते हैं और वह एक सप्ताह बाद भी सही स्थान की ओर इशारा करती है।

तीन ऑपरेशन इस बात पर मैप होते हैं कि एक ट्री के साथ वास्तव में क्या हो सकता है। बाएँ में मौजूद लेकिन दाएँ में न होने वाली कुंजी एक हटाना है, इसका विपरीत एक जोड़ना है, और दोनों में मौजूद भिन्न मान वाली कुंजी एक बदलाव है। प्रकार परिवर्तन — एक फ़ील्ड जो पहले संख्या 1 थी और अब स्ट्रिंग "1" है — भी बदलाव के रूप में रिपोर्ट होते हैं, और उन पर ध्यान देने लायक हैं, क्योंकि वे डाउनस्ट्रीम बग्स का एक सामान्य स्रोत हैं जिन्हें कोई स्कीमा जाँच नहीं पकड़ती।

ऐरेज़ और क्रम का प्रश्न

ऐरेज़ वहाँ हैं जहाँ संरचनात्मक डिफ़िंग राय रखती है। डिफ़ॉल्ट रूप से तुलना स्थितीय है: बाएँ का अनुक्रमांक 0 दाएँ के अनुक्रमांक 0 से तुलना किया जाता है। यह कदमों के अनुक्रम जैसे क्रमबद्ध डेटा के लिए सही है, लेकिन एक सूची के लिए जो वास्तव में एक सेट है एक भ्रामक परिणाम देता है — तत्वों को पुनः क्रमबद्ध करें और हर स्थिति बदली हुई प्रतीत होती है।

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

ओपन-सोर्स नोट: शुद्ध JavaScript (vanilla) में बिना किसी तृतीय-पक्ष लाइब्रेरी के कार्यान्वित किया गया है।

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

यह एक सामान्य टेक्स्ट डिफ़ से कैसे भिन्न है?
एक टेक्स्ट डिफ़ पंक्तियों की तुलना करता है, इसलिए पुनः इंडेंट करना या कुंजियों को पुनः क्रमबद्ध करना एक परिवर्तन के रूप में दिखता है। यह टूल पहले दोनों पक्षों को पार्स करता है, इसलिए केवल डेटा में वास्तविक अंतर रिपोर्ट होते हैं।
+, - और ~ प्रतीकों का क्या अर्थ है?
प्लस एक ऐसा पथ है जो केवल संशोधित दस्तावेज़ में मौजूद है, माइनस केवल मूल में मौजूद है, और टिल्ड एक ऐसा पथ है जो दोनों में भिन्न मान के साथ मौजूद है।
पुनः क्रमबद्ध ऐरे को बदला हुआ क्यों रिपोर्ट किया जाता है?
डिफ़ॉल्ट रूप से ऐरेज़ की स्थिति-दर-स्थिति तुलना की जाती है, जो क्रमबद्ध डेटा के लिए सही है। उन्हें अक्रमित सेटों के रूप में तुलना करने के लिए ऐरे क्रम अनदेखा करें चालू करें।
क्या किसी ऑब्जेक्ट में कुंजी क्रम मायने रखता है?
नहीं। ऑब्जेक्ट्स की कुंजी से तुलना की जाती है, इसलिए किसी ऑब्जेक्ट के भीतर किसी फ़ील्ड को ले जाने से कभी अंतर नहीं बनता। केवल ऐरे तत्वों की स्थितियाँ क्रम-संवेदी हैं।
क्या स्ट्रिंग बनी संख्या को फ़्लैग किया जाता है?
हाँ। एक प्रकार परिवर्तन को बदलाव के रूप में रिपोर्ट किया जाता है, जो जानबूझकर है: 1 और "1" डाउनस्ट्रीम बहुत भिन्न व्यवहार करते हैं और अन्यथा मेल न होना छूटना आसान है।
क्या मेरे दस्तावेज़ सर्वर पर भेजे जाते हैं?
नहीं। दोनों पक्ष आपके ब्राउज़र में पार्स और तुलना किए जाते हैं, इसलिए कुछ भी अपलोड, लॉग या संग्रहीत नहीं किया जाता।