أدوات المطور · JSON المنسق والمدقق
هل ترتيب المفتاح مهم في JSON؟ الترتيب والمساواة و RFC 8785
· خلفية
json المعايير تصديق
تستدعي مواصفات JSON الكائنات غير مرتبة، لكن الموزعين والمتسلسلين الحقيقيين عادةً ما يحافظون على الترتيب، وتعتمد أنظمة التوقيع عليه. يوضح هذا المنشور ما تقوله المواصفات، وما تفعله التطبيقات، وكيف يحل التحديد الأساسي التوتر.
نفس البيانات، بايت مختلفة
يحتوي `{"city":"Oslo","temp":4}` و`{"temp":4,"city":"Oslo"}` على نفس الاسمين والقيمتين، إلا أن وحدات البايت المصدر الخاصة بهما تختلف. يمكن أن تضيف المسافة البادئة العديد من الاختلافات النصية دون تغيير أي من القيمتين المحللتين. ولهذا السبب يحتاج "يساوي JSON" إلى قاعدة مقارنة: هل تقارن نصًا أو كائنات تم تحليلها أو تمثيلًا أساسيًا محددًا بواسطة بروتوكول آخر؟
يمكن لـ ToolAcre إزالة تشويش المسافات البيضاء عن طريق تنسيق كلا المستندين بنفس المسافة البادئة. يمكنه أيضًا فرز مفاتيح الكائنات بشكل متكرر عند تحديد هذا الخيار. يؤدي الفرز إلى تغيير ترتيب الأعضاء بشكل متعمد ولكنه لا ينقل عناصر المصفوفة مطلقًا، لأن موضع المصفوفة يمثل البيانات. لا يؤدي التنسيق العادي ولا هذا الفرز الاختياري إلى إنتاج RFC 8785 أساسي JSON، لذلك لا يجب استبدال الإخراج بتنسيق توقيع محدد.
ما يقوله RFC 8259 - الكائن عبارة عن مجموعة غير مرتبة من أزواج name/value، وقد تكشف عمليات التنفيذ الترتيب أم لا
RFC 8259 يصف الكائن على أنه مجموعة غير مرتبة من أزواج name/value. لذلك، فإن البرنامج الذي يتعامل مع ترتيب الأعضاء باعتباره معنى كائن JSON العادي يعتمد على سلوك خارج هذا النموذج المجرد. يتم ترتيب المصفوفات بشكل صريح، لذا فإن `["draft","final"]` غير قابل للتبديل مع `["final","draft"]`. لا يجب أبدًا تسوية ترتيب الكائنات وترتيب المصفوفة بنفس القاعدة.
يشير RFC أيضًا إلى أن المكتبات تختلف في ما إذا كانت تعرض طلبات الأعضاء للمتصلين أم لا. هذا التحذير كافٍ للتصميم المحمول: لا تقم بتشفير الأولوية أو التسلسل عن طريق وضع عضو كائن قبل الآخر. إذا كان التسلسل مهمًا، قم بتمثيله بمصفوفة أو بحقل صريح. يُعد المنسق الذي يُظهر ترتيبًا مستقرًا مناسبًا للبشر، ولكنه لا يحول الموضع إلى خاصية على مستوى المعايير للكائن.
ما يفعله هذا المنسق في الواقع
مع تعطيل الفرز، يقوم ToolAcre بتحليل المستند وإجراء تسلسل لقيمة JavaScript الناتجة. يتبع الإخراج سلوك تعداد الخاصية JavaScript بدلاً من الحفاظ على بايت دفق الرمز المميز الأصلي للبايت. تظهر معظم مفاتيح السلسلة العادية بترتيب مألوف، بينما يمكن إصدار الأسماء التي تشبه فهرس الأعداد الصحيحة قبل الأسماء الأخرى. يمكن أيضًا تسوية خيارات تهجئة الأرقام والهروب أثناء إعادة التسلسل.
مع تمكين الفرز، يقوم المنسق بإنشاء كائنات جديدة يتم ترتيب مفاتيحها أبجديًا عند كل كائن متداخل. بالنسبة إلى `{"z":{"b":1,"a":2},"items":[{"d":4,"c":3},"x"]}`، تصبح أسماء الكائنات `items`، `z`؛ ويتم فرز أسماء الكائنات المتداخلة أيضًا؛ ولا يزال المصفوفة تحتوي على كائنها قبل `"x"`. فرز الكائنات داخل المصفوفة لا يعني فرز المصفوفة نفسها.
عندما يكون ترتيب البايت مهمًا
يعد الترتيب النصي مهمًا عندما تستهلك العملية وحدات البايت الدقيقة بدلاً من القيمة المجردة. تتغير تجزئة الملف أو مفتاح التخزين المؤقت أو التوقيع الرقمي أو الفروق المستندة إلى الخط عندما يتحرك الأعضاء أو تتغير المسافات البيضاء. وهذا لا يتعارض مع نموذج الكائن غير المنظم؛ فهذا يعني أن العملية المحيطة قد اختارت تمثيل البايت كجزء من مدخلاتها. يجب أن تكون قواعد التمثيل صريحة ومشتركة.
بالنسبة للمراجعات الروتينية، يمكن أن تؤدي المسافة البادئة المتسقة والفرز الأبجدي الاختياري إلى تسهيل رؤية التغييرات. بالنسبة لأعمال التشفير أو البروتوكول، فإن عبارة "يبدو مستقرًا" ليست عقدًا. يجب على المنتج والمتحقق استخدام خوارزمية التحديد الأساسية الدقيقة التي يتطلبها البروتوكول الخاص بهم قبل التجزئة أو التوقيع. إذا لم يتم تسمية أي خوارزمية، فلا تفترض أن مخرجات ToolAcre ستتطابق مع مُسلسِل آخر عبر الإصدارات أو أوقات التشغيل أو قيم حالة الحافة.
لماذا لا يتم تصنيف المفاتيح RFC 8785
RFC 8785 يحدد JSON نظام تحديد النطاق الأساسي لإنتاج بايتات قابلة للتكرار من البيانات المتوافقة. عملها أوسع من وضع المفاتيح حسب الترتيب الأبجدي. وهو يحدد فرز الخصائص الحتمية جنبًا إلى جنب مع سلوك التسلسل الدقيق للسلاسل والأرقام ويفرض قيودًا على نموذج الإدخال. لا تعد المسافة البادئة الجميلة جزءًا من المخرجات الأساسية، كما أن الفرز المدرك للغة ليس تقديرًا تقريبيًا مقبولًا.
ToolAcre لا يقدم أي مطالبة RFC 8785. خيار الفرز الخاص به هو ميزة سهولة القراءة الموجودة في طبقات فوق `JSON.parse` و`JSON.stringify`؛ ولا يتحقق من صحة الشروط المسبقة I-JSON أو يحل محل قواعد التسلسل RFC. يمكن لقيمة مثل `1e-7`، أو مفتاح يحتوي على أحرف غير ASCII أو سلسلة تم تجاوزها، أن تكشف عن الاختلافات بين المنسق المرتقب غير الرسمي والمحدد الأساسي المطابق. استخدم تطبيق JCS الذي تم اختباره عندما يكون JCS مطلوبًا.
مثال عملي: مقارنة وثيقتين بشكل عادل
قارن `{"meta":{"rev":2,"owner":"Mira"},"steps":["cut","pack"]}` مع `{"steps":["cut","pack"],"meta":{"owner":"Mira","rev":2}}`. قم بالتنسيق مع مسافتين وتعطيل الفرز: تصبح المسافة البيضاء متسقة، ولكن لا يزال من الممكن أن تختلف ترتيبات الأعضاء الجذرية والمتداخلة. قم بتحليل كليهما ومقارنة الحقول المقصودة لإنشاء تكافؤ على مستوى القيمة بدلاً من إعلان تساوي النص الخام.
قم بتشغيل فرز المفاتيح العودية وسيتم عرض كلا المثالين بنفس ترتيب الكائنات بينما يظل `steps` `cut` ثم `pack`. يعد هذا مفيدًا للفرق البشري، لكنه لا يزال يمثل تطبيع ToolAcre، وليس RFC 8785 دليلاً. إذا كان المصفوفة الثانية `["pack","cut"]`، فإن مفاتيح الفرز ستترك هذا الاختلاف مرئيًا بشكل صحيح لأن تغيير المصفوفة سيؤدي إلى تغيير التسلسل الممثل.
ما لا يغطيه هذا
لا يحدد فرز المفاتيح المساواة العميقة لكل تطبيق. يتم قبول الأسماء المكررة بواسطة `JSON.parse`، الذي يحتفظ بالقيمة الأخيرة، لذا يمكن أن يؤدي التنسيق إلى مسح الدليل الذي يحتوي على مصدر واحد يحتوي على تكرارات. قد تكون الأعداد الصحيحة الكبيرة قد فقدت الدقة في القيمة JavaScript بالفعل. قد يتعامل المجال أيضًا مع المصفوفات المحددة كمجموعات، لكن ToolAcre لا يمكنه استنتاج تلك القاعدة وبالتالي لا يعيد ترتيب المصفوفات أبدًا.
لا يقوم المنسق أيضًا بمقارنة المخططات أو تطبيق الإعدادات الافتراضية أو تطبيع Unicode أو تحديد ما إذا كان تمثيل الرقمين مقبولاً لنظام المصب. هذه عقود منفصلة. استخدم التنسيق لتقليل تشويش العرض التقديمي، والمقارنة الهيكلية المخصصة لهذا الغرض لتحقيق المساواة في القيمة، والمحدد الأساسي المحدد للبايتات الدقيقة. إن خلط هذه الوظائف تحت كلمة "تطبيع" يخلق ثقة زائفة بشأن ما تم مقارنته بالفعل.
الوجبات الجاهزة: الترتيب غير مهم بالنسبة للنموذج ومهم بالنسبة للبايتات
لا يحمل ترتيب أعضاء الكائن معنى في نموذج البيانات RFC 8259، بينما يحمل ترتيب المصفوفة معنى. لا تزال بايتات المصدر تسجل كلاً من الترتيب والمسافات البيضاء، لذا فإن التجزئات والتوقيعات واختلافات النص تلاحظ الفروق التي قد تتجاهلها المقارنة الموجهة نحو القيمة. حدد الطبقة المهمة قبل اختيار الأداة: الهوية النصية، وتكافؤ القيمة المحللة، والهوية الأساسية المحددة بواسطة البروتوكول هي ثلاثة أسئلة مختلفة.
ToolAcre يدعم أول سيري عمل بشكل غير مباشر فقط: التنسيق المتسق يوضح الاختلافات النصية، والفرز الأبجدي المتكرر لمفتاح الكائن يمكن أن يجعل المقارنات البشرية أكثر هدوءًا. لا يتم فرز المصفوفات أبدًا. النتيجة ليست RFC 8785 أساسية JSON ولا يجب توقيعها كما لو كانت كذلك. احتفظ بالمدخلات الأصلية عندما تكون الأدلة المعجمية مهمة، خاصة وأن تحليل المفاتيح المكررة يحتفظ بالقيمة الأخيرة فقط.