JSON Diff

قارن مستندي JSON بالبنية وليس بالسطر. يُبلغ عن المسارات المضافة والمحذوفة والمتغيرة، مع خيار تجاهل ترتيب المصفوفات. يعمل بالكامل في متصفحك.

قارن بالبنية، وليس بالسطر. الصق مستندين واحصل على تقرير مسار-بمسار لما أُضيف أو حُذف أو تغيّر. ولأن المقارنة تتنقل بين القيم المُحلَّلة، فإن إعادة التنسيق أو إعادة ترتيب المفاتيح لا تظهر كفرق.

الاختلافات

لماذا فرق النص هو الأداة الخاطئة لـ JSON

فرق الأسطر يرى التنسيق، لا المعنى

يعامل فرق الأسطر القياسي JSON كنص عادي. أعد المسافة البادئة لملف من مسافتين إلى أربع وستُعلَّم كل سطر كمتغيّر. انقل مفتاحًا من أعلى كائن إلى أسفله وستحصل على حذف واحد وإضافة واحدة، رغم أن القيمة المُحلَّلة هي نفسها تمامًا. ضع مصفوفة طويلة في سطر واحد وسيضيء الكتلة بأكملها.

يقوم الفرق البنيوي بتحليل الجانبين أولًا ثم يتنقل بين القيم الناتجة. يختفي التنسيق وترتيب المفاتيح والمسافات البيضاء قبل أن تبدأ المقارنة، لذا فإن الأشياء الوحيدة التي يمكن الإبلاغ عنها هي اختلافات حقيقية في البيانات. وهذا ما يجعل المخرجات قصيرة بما يكفي لقراءتها فعلًا.

مسارات، لا أرقام أسطر

يُبلَّغ عن كل اختلاف هنا مقابل مسار مثل user.roles[2] أو meta.updated. ينجو المسار من التعديلات في أماكن أخرى من المستند، وهو ما لا يفعله رقم السطر، لذا يمكنك لصق نفس التقرير في تذكرة أو مراجعة كود ويظل يشير إلى المكان الصحيح بعد أسبوع.

العمليات الثلاث تقابل ما يمكن أن يحدث فعلًا لشجرة. مفتاح موجود في اليسار دون اليمين هو إزالة، والعكس هو إضافة، والمفتاح الموجود في كليهما بقيمة مختلفة هو تغيير. تُبلَّغ أيضًا تغييرات النوع — حقل كان رقمًا 1 وأصبح سلسلة "1" — كتغييرات، وتستحق الانتباه لأنها مصدر شائع للأخطاء اللاحقة التي لا يلتقطها أي فحص مخطط.

المصفوفات ومسألة الترتيب

هنا يصبح الفرق البنيوي مسألة رأي. افتراضيًا تكون المقارنة موضعية: يقارن الفهرس 0 في اليسار بالفهرس 0 في اليمين. وهذا صحيح للبيانات المرتبة مثل تسلسل خطوات، لكنه ينتج نتيجة مضللة لقائمة هي في الحقيقة مجموعة — أعد ترتيب العناصر ويبدو كل موضع متغيرًا.

يعمل خيار تجاهل ترتيب المصفوفات على تطبيع الجانبين بفرز المصفوفات بعمق قبل المقارنة، لذا تُقارن القائمة المعاد ترتيبها كمتساوية. استخدمه لقوائم الوسوم ومجموعات الصلاحيات ونتائج الاستعلام دون ترتيب مضمون. اتركه معطّلًا كلما حمل موضع العنصر معنى، لأنه مع تشغيله يصبح خطأ إعادة ترتيب حقيقي غير مرئي.

إشعار مفتوح المصدر: نُفذ بلغة JavaScript نقية دون أي مكتبات تابعة لجهات خارجية.

الأسئلة الشائعة

كيف يختلف هذا عن فرق النص العادي؟
يقارن فرق النص الأسطر، لذا تظهر إعادة المسافات البادئة أو إعادة ترتيب المفاتيح كتغيير. تحلل هذه الأداة الجانبين أولًا، لذا لا يُبلَّغ إلا عن الاختلافات الحقيقية في البيانات.
ماذا تعني رموز + و - و ~؟
الزائد مسار موجود فقط في المستند المعدَّل، والناقص موجود فقط في الأصلي، والشرطة المتموجة مسار موجود في كليهما بقيمة مختلفة.
لماذا تُبلَّغ مصفوفة معاد ترتيبها كمتغيرة؟
افتراضيًا تُقارن المصفوفات موضعًا بموضع، وهو الصحيح للبيانات المرتبة. فعّل تجاهل ترتيب المصفوفات لمقارنتها كمجموعات غير مرتبة بدلًا من ذلك.
هل يهم ترتيب المفاتيح في الكائن؟
لا. تُقارن الكائنات بالمفاتيح، لذا لا ينتج نقل حقل داخل كائن فرقًا أبدًا. فقط مواضع عناصر المصفوفات حساسة للترتيب.
هل يُعلَّم رقم أصبح سلسلة؟
نعم. يُبلَّغ عن تغيير النوع كتغيير، وهو أمر متعمد: يتصرف 1 و"1" بشكل مختلف جدًا في المصب ومن السهل تفويت عدم التطابق بخلاف ذلك.
هل تُرسل مستنداتي إلى خادم؟
لا. يُحلَّل الجانبان ويُقارنان في متصفحك، لذا لا يُرفع أو يُسجَّل أو يُخزَّن شيء.