abox.tools

اللغة: العربية

كيف تقارن ملفي JSON

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

افتح مقارن النصوص نصّان يدخلان، وكل فرق يخرج معلَّماً، سطراً سطراً وكلمةً كلمة. ولا شيء يُلصَق في خادم أحد آخر.

عرض بصيغة Markdown

الجواب المختصر

  1. افتح منسِّق JSON، والصق الملف الأول، واضبط المسافة البادئة على مسافتين، وعلِّم خانة ترتيب مفاتيح كل كائن. ثم انسخ الناتج.
  2. افتح مقارن النصوص والصقه في الحقل الأيمن الأول.
  3. وافعل الشيء نفسه بالملف الثاني، في الحقل الآخر.

ما يضيء الآن حقيقي: قيمة تغيّرت، أو مفتاح ظهر، أو مدخل ذهب. أما فروق التنسيق والمفاتيح المعاد ترتيبها التي كانت ستغرق مقارنة عادية فقد زالت، لأن الجانبين كُتبا بالهجاء نفسه قبل أن تبدأ المقارنة.

وليست لأي من الصفحتين وظيفة شبكية البتة، وذلك جدير بالعلم: فالـ JSON الذي يقارنه الناس كثيراً ما يكون ملف إعدادات ما تزال فيه بيانات الدخول.

لماذا مقارنة JSON الخام جلّها ضجيج

JSON لا يبالي بالمسافات، ولا يمنح ترتيب المفاتيح معنى. فالمستند نفسه قد يكون سطراً أو أربعمئة، ومفاتيحه بترتيب كتابتها أو بترتيب أخرجته مكتبة ما — والأدوات تعيد كتابة الاثنين بلا استئذان. جانب مضغوط والآخر مبسوط؛ جانب حُفظ يدوياً والآخر بمسلسِل يرتب أبجدياً: مقارنة الأسطر ترى ملفين غريبين.

وأسوأ حالتين تكفيان بياناً. الملف المصغَّر سطر واحد، فمقارنته سطر واحد متغيّر هائل: صحيح وعديم النفع. وملفان فيهما المحتوى نفسه بترتيب آخر يقارَنان على أن كل شيء تغيّر، والجواب الصادق كان «لا شيء».

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

ما الذي تصلحه الصيغة القياسية للمنسِّق

تمرير الملفين على المنسِّق نفسه بالإعدادات نفسها هو بالضبط ما تحتاجه المقارنة: هجاء واحد لكل مستند.

وتحفظ صادق: الناتج المرتب هو المستند وقد تحركت مفاتيحه. فإن كانت أداة لاحقة تعبأ بترتيب المفاتيح — وقليل يفعل، لكنه موجود — فعامل النسختين المرتبتين على أنهما الشيء المقارَن، لا بديلَي الأصلين.

قراءة الناتج، وأخذه معك

يعلِّم المقارن الأسطر المحذوفة في جانب والمضافة في الجانب الآخر، ويبرز داخل السطر المتغيّر الكلمات المختلفة: وعلى صيغة قياسية يكون ذلك عادة القيمة الوحيدة التي انتقلت من false إلى true. والوسط الذي لم يتغيّر يُطوى إلى عدد، فتُقرأ إعدادات من ألفي سطر فيها ثلاثة تعديلات كثلاث فقرات قصيرة.

والتنزيل رقعة موحَّدة، ملف .patch: الصيغة التي تفهمها مراجعة الشيفرة. وهي تصف الصيغتين القياسيتين، وذلك عادة ما تريده المراجعة على كل حال: التغيير، من دون إعادة التنسيق.

والوصفة نفسها تصلح لكل ما تتكلمه الصفحتان. فـ YAML وXML يتقيّسان بالطريقة نفسها؛ ولملفين على الشكل نفسه من مصدرين مختلفين، مفاتيح التجاهل في المقارن — المسافات وحالة الأحرف والأسطر الفارغة — نسخة أخف من الفكرة نفسها.

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

إن كنت تفعل هذا كل أسبوع

تنسيقان ولصقتان: تعيش الخطوات في صفحتين لأن كل صفحة تؤدي عملاً واحداً، وكلٌّ منهما تثبت وحدها أن شيئاً مما لصقته لم يذهب إلى أي مكان. غير أن الاثنتين مفتوحتا المصدر: رخصة MIT، ووحدات ES بلا تبعيات — محلِّل المنسِّق يحفظ ترتيب المفاتيح والأرقام، والمقارنة خوارزمية Myers — ولكلٍّ README يشرحها.

فإن كان هذا جزءاً من يومك، وجِّه وكيل برمجة إلى المستودع واطلب صفحة بحقلين تقيِّس وهي تقارن: فـ parseJson وprintJson وcompareText على بعد ثلاثة استيرادات. الوحدات كُتبت لتُقرأ، وأخذها هو بالضبط ما وُجدت الرخصة له.