सभी लेख

JSON Diff: संरचनात्मक तुलना टेक्स्ट तुलना से कैसे अलग है

अगर दो JSON दस्तावेज़ों की तुलना सामान्य टेक्स्ट diff से की जाए (जैसे कोड के लिए इस्तेमाल होता है), तो नतीजा अक्सर भ्रामक होता है: एक ही डेटा को अलग-अलग कुंजी क्रम, अलग इंडेंटेशन, या अलग संख्या में स्पेस के साथ लिखा जा सकता है — और टेक्स्ट diff वहाँ "अंतर" दिखाएगा जहाँ डेटा वास्तव में एक जैसा है।

संरचनात्मक तुलना

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

diff क्या दिखाता है

एक सामान्य संरचनात्मक तुलना नतीजा तीन तरह के बदलाव उजागर करता है: दूसरे दस्तावेज़ में जोड़े गए फ़ील्ड, पहले से हटाए गए फ़ील्ड, और दोनों में मौजूद लेकिन अलग वैल्यू वाले फ़ील्ड। ऐरे के लिए तुलना ज़्यादा जटिल है — यह तय करना पड़ता है कि एलिमेंट्स की तुलना पोज़ीशन से करें या मिलते-जुलते ऑब्जेक्ट को मैच करने की कोशिश करें।

यह क्यों ज़रूरी है

  • बैकएंड में बदलाव से पहले और बाद के API रिस्पॉन्स की तुलना करके डेटा में असली बदलाव देखना।
  • यह जाँचना कि कॉन्फ़िग फ़ाइल में किए गए बदलाव ने कुछ अनपेक्षित तो नहीं छुआ।
  • ऐसे टेस्ट में रिग्रेशन ढूँढना जहाँ अपेक्षित और वास्तविक JSON अलग हों।

22 भाषाओं वाले ऐप में अनुवाद फ़ाइलों का diff

भारत में बनने वाले ज़्यादातर बड़े ऐप एक साथ hi, ta, te, bn, mr, gu, kn, ml जैसी कई भाषाओं को सपोर्ट करते हैं, और हर भाषा का अपना अलग JSON ट्रांसलेशन फ़ाइल होती है। जब en.json में कोई नई कुंजी जुड़ती है, तो बाक़ी सभी भाषा फ़ाइलों में वह कुंजी कहीं छूट सकती है — यह ग़लती हाथ से पकड़ना लगभग नामुमकिन है, लेकिन en.json और hi.json के बीच स्ट्रक्चरल diff चलाकर छूटी हुई कुंजियाँ सेकंडों में सामने आ जाती हैं, ख़ासकर जब सपोर्ट की जाने वाली भाषाओं की संख्या इतनी बड़ी हो।

ऐरे की तुलना: पोज़ीशन से या कुंजी से

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

टूल आज़माएँ