كل المقالات

JSON Sort Keys: لماذا نرتب مفاتيح الكائن

لا تحدد مواصفات JSON رسميًا ترتيب المفاتيح في الكائن — {"a": 1, "b": 2} و{"b": 2, "a": 1} يمثلان نفس البيانات. لكن عمليًا، لا يزال ترتيب المفاتيح مهمًا غالبًا للأشخاص والأدوات التي تعمل مع هذه البيانات.

لماذا نرتب المفاتيح

  • المقارنة (diff). إذا كان لمستندي JSON بنفس البيانات ترتيب مفاتيح مختلف، سيُظهر الديف النصي فرقًا خاطئًا. الترتيب يزيل هذه المشكلة.
  • الناتج الحتمي. إذا سُلسِل نفس الكائن عدة مرات (مثلاً لتوليد هاش أو مفتاح تخزين مؤقت)، تضمن المفاتيح المرتبة نفس النتيجة في كل مرة.
  • سهولة القراءة. الكائن المرتب أبجديًا أسهل في التصفح السريع وإيجاد حقل معين، خاصة في البنى الكبيرة.

الترتيب التكراري

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

متى لا نحتاج ذلك

إذا كان JSON يُستهلَك فقط من برنامج (لا من إنسان أو أداة ديف)، فترتيب المفاتيح عادة لا يقدم أي فائدة عملية — تقرأ المحللات الكائن بنفس الطريقة بغض النظر عن ترتيب الحقول.

لماذا لا يؤثر تغيّر شكل الحرف العربي على الترتيب

الحرف العربي يغيّر شكله بصريًا حسب موضعه في الكلمة — منفصل، أو في البداية، أو في الوسط، أو في النهاية (مثلاً حرف العين: ع، عـ، ـعـ، ـع) — لكن يونيكود يخصص لكل حرف عربي نقطة ترميز منطقية واحدة فقط، والأشكال المختلفة هي مجرد عرض بصري يتولاه محرك تشكيل النص (text shaping)، لا بيانات مخزَّنة فعليًا. لذلك ترتيب مفاتيح JSON عربية أبجديًا لا يتأثر إطلاقًا بهذا التغيّر الشكلي — المقارنة تتم دائمًا على نقاط الترميز المنطقية الثابتة، بغض النظر عن الشكل الذي سيظهر به الحرف على الشاشة.

الترتيب واللغة/المحلية

يعتمد الترتيب الأبجدي للمفاتيح التي تحتوي أحرفًا غير لاتينية على ما إذا كانت الأحرف تُقارَن بايتًا بايت (Unicode code point) أو وفق قواعد لغوية (locale-aware collation). فمثلًا، المقارنة حسب نقطة الكود تضع الأحرف الكبيرة قبل الصغيرة بغض النظر عن الأبجدية، بينما قد يرتب الترتيب المراعي للمحلية المفاتيح بشكل مختلف.

جرّب الأداة