طريقة الاستخدام
- الصق JSON القديم في JSON الأيسر، والجديد في JSON الأيمن.
- ضع علامة على تجاهل ترتيب عناصر المصفوفات إن كانت المصفوفات مجموعات، مثل قوائم الوسوم.
- اقرأ جدول الاختلافات. يعطي كل صف المسار (JSON Pointer) للقيمة، وانسخ رقعة JSON Patch (RFC 6902) عندما يقول فحص الرقعة إنها تُطبَّق.
كيف تُقارَن المستندات
تُقارَن المستندات بالقيمة. ترتيب الأسماء داخل الكائن لا يهم، لأن JSON يعرّف الكائن بأنه مجموعة من الأعضاء. أما ترتيب العناصر في المصفوفة فيهم، ما لم تضع علامة على الخيار، لأن المصفوفة قائمة مرتبة.
تُقارَن الأعداد كأعداد، فالعددان 1 و1.0 متساويان. ويقول القسم 6 من RFC 8259 إن الأعداد الصحيحة من -(2^53)+1 إلى (2^53)-1 تقرؤها كل تطبيقات JSON بالطريقة نفسها، وقد يُقرَّب العدد الصحيح الأطول عند قراءته.
المسارات والرقعة
المسار هو JSON Pointer (RFC 6901): كل خطوة اسم أو فهرس، ويفصل بينهما شرطة مائلة. فأول عنصر في قائمة الوسوم هو /tags/0، والمسار الفارغ يعني المستند كله. وتُكتب الشرطة المائلة داخل الاسم بالرمز ~1، وتُكتب علامة التلدة بالرمز ~0.
تستخدم رقعة JSON Patch (RFC 6902) ثلاث عمليات: add وremove وreplace. تُحذف عناصر المصفوفة المحذوفة من الأخير إلى الأول، حتى يبقى كل فهرس صحيحاً عند استخدامه، وتُضاف العناصر الجديدة في النهاية بالفهرس "-"، الذي يعرّفه RFC 6902 بأنه نهاية المصفوفة.
تجاهل ترتيب المصفوفات
عند تحديد الخيار، تُطابَق العناصر بقيمتها مهما كان موضعها. والعناصر التي لا نظير لها تُعرض كإضافة أو حذف. والمصفوفة المختلفة تُستبدل كاملة في الرقعة، لأن رقعة تنقل العناصر فقط ستحتاج إلى معرفة كيف انتقلت. ثم تعطي الرقعة المصفوفة بترتيب المستند الأيمن.
مثال محلول: المستندات الافتراضية
المستند الأيسر له الاسم FireToolLand والإصدار 1، والوسمان json وcsv، وفيه free بقيمة true. والمستند الأيمن له الإصدار 2، والوسوم csv وjson وyaml، وفيه license بقيمة null. والاختلافات عند القراءة بالترتيب ستة: الإصدار، والوسمان المتغيران، والوسم yaml المضاف، وحذف free، وإضافة license.
مع تحديد تجاهل ترتيب عناصر المصفوفات، تصبح الوسوم العنصرين نفسيهما بترتيب آخر، فيبقى فرق الوسوم هو yaml وحده، فينخفض العدد إلى أربعة.
| النتيجة | المستندات الافتراضية | مع تجاهل الترتيب |
|---|---|---|
| عدد الاختلافات | 6 | 4 |
| الملخص | إضافات: 2، حذف: 1، تغييرات: 3. | إضافات: 2، حذف: 1، تغييرات: 1. |
الأسئلة الشائعة
لماذا يهم ترتيب عناصر المصفوفة؟
المصفوفة في JSON قائمة مرتبة، لذلك فالمصفوفتان [1,2] و[2,1] بيانات مختلفة. ضع علامة على تجاهل ترتيب عناصر المصفوفات عندما تكون المصفوفة مجموعة، مثل قائمة وسوم أو صلاحيات.
ماذا يعني مسار مثل /tags/0؟
هو JSON Pointer (RFC 6901): العضو tags ثم أول عنصر فيه، لأن الفهارس تبدأ من 0. والمسار الفارغ يعني المستند كله، والاسم الذي يحتوي شرطة مائلة يُكتب بالرمز ~1 مكانها.
هل 1 و1.0 قيمة واحدة؟
نعم. كلاهما العدد واحد، فلا تعرض الصفحة أي اختلاف. وقد يُقرّب محلل JSON الأعداد الصحيحة الأكبر من 2^53، لذلك قارن المعرّفات الطويلة كنصوص.
ما فائدة رقعة JSON Patch؟
هي قائمة خطوات (RFC 6902) يطبّقها خادم أو مكتبة على مستند واحد ليحصل على مستند آخر، مثلاً لتحديث ملف إعدادات محفوظ. وفحص الرقعة يبيّن أن الخطوات تعطي المستند الصحيح.
لماذا تُستبدل المصفوفة كلها عند تجاهل الترتيب؟
عند تجاهل الترتيب لا توجد خطوة واحدة تحوّل المصفوفة المتغيرة إلى الصحيحة دون معرفة كيف انتقلت عناصرها. لذلك تكتب الرقعة المصفوفة الصحيحة كاملة.
هل يُرسل JSON الخاص بي إلى أي مكان؟
لا. يُقرأ النصان ويُقارنان في متصفحك، ولا يُرسل ما تلصقه إلى خادمنا ولا يُخزَّن هناك.
المصادر
- RFC 8259 (باللغة الإنجليزية): The JavaScript Object Notation (JSON) Data Interchange Format
- RFC 6901 (باللغة الإنجليزية): JavaScript Object Notation (JSON) Pointer
- RFC 6902 (باللغة الإنجليزية): JavaScript Object Notation (JSON) Patch
آخر مراجعة للأرقام والنص: الثلاثاء، 30 جمادى الأولى 1448 بعد الهجرة.