أدوات المطور · JSON المنسق والمدقق
JavaScript حرفية الكائن مقابل JSON: لماذا تفشل علامات الاقتباس المفردة في التحقق من الصحة
· كيف يعمل
json سير عمل المطور تصديق
يبدو الكائن المطبوع بواسطة وحدة التحكم JavaScript مثل JSON ولكنه ليس كذلك في العادة. يسرد هذا المنشور الاختلافات الدقيقة (علامات الاقتباس، والمفاتيح غير المقتبسة، وغير المحددة، والوظائف) ويوضح مكان قيام كل منها برحلة إلى أداة التحقق.
لقد خرج من وحدة التحكم، فلماذا هو غير صالح؟
لقد خرج من وحدة التحكم، فلماذا هو غير صالح؟ — تعرض وحدات تحكم المطورين قيم JavaScript كنص يشبه المصدر JavaScript، وليس كتسلسل JSON مضمون. قد يحتوي الكائن المنسوخ على أسماء خصائص عارية أو سلاسل ذات علامات اقتباس مفردة أو `undefined` أو تعليقات توضيحية خاصة بالمتصفح. يمكن أن يكون كل ذلك مفهومًا لمحرك JavaScript أو للقارئ البشري بينما يفشل على الفور في ملف `.json`، الذي تكون قواعده النحوية أصغر عمدًا ومستقلة عن التعليمات البرمجية القابلة للتنفيذ.
خذ بعين الاعتبار `{name: "Ada", active: true, missing: undefined}`. تشبه الأقواس والنقطتان والمنطقية JSON، لكن المفتاح العاري الأول ينتهك بالفعل قاعدة عضو الكائن، وسيفشل `undefined` لاحقًا. يُبلغ ToolAcre عن أول حرف أو قيمة غير مدعومة مع سطر وعمود، لذلك من الأفضل إجراء التحويل بالترتيب.
يجب أن تستخدم السلاسل علامات الاقتباس المزدوجة
يجب أن تستخدم السلاسل علامات الاقتباس المزدوجة - يُعرّف JSON السلسلة بأنها أحرف محاطة بـ `"`، مع هروب الشرطة المائلة العكسية عند الحاجة. اقتباس واحد ليس له دور كمحدد سلسلة. عندما يلتقي المدقق مع `'Ada'`، فإنه لا يبدأ سلسلة ثم يعترض على محتوياتها؛ فهو يرفض الفاصلة العليا الافتتاحية نفسها. ينطبق هذا بالتساوي على أسماء الخصائص وقيم السلسلة، على الرغم من أن JavaScript يسمح بأي من نمطي الاقتباس للقيم الحرفية الخاصة به.
يتطلب تحويل علامات الاقتباس عناية أكبر من استبدال كل فاصلة عليا عالميًا. الفاصلة العليا داخل النص مثل `Ada's profile` هي محتوى عادي بمجرد أن يتم وضع القيمة بين علامتي اقتباس، بينما يجب تجاوز علامات الاقتباس المزدوجة الموجودة داخل هذا المحتوى. نموذج JSON الصالح هو `"Ada's "profile""`.
يجب أن تكون المفاتيح سلاسل مقتبسة
يجب أن تكون المفاتيح عبارة عن سلاسل مقتبسة — JavaScript تسمح القيم الحرفية للكائنات بأسماء نمط المعرفات مثل `{name: 1}` والأسماء المحسوبة مثل `{[expression]: 1}`. JSON لا يسمح بأي اختصار. بعد القوس الافتتاحي أو الفاصلة، يجب أن يبدأ العضو التالي بسلسلة ذات علامات اقتباس مزدوجة، متبوعة بنقطتين. التمثيل الصالح هو `{"name": 1}`. يقوم المدقق الذي يشير إلى `n` بتحديد المكان الدقيق الذي كان مطلوبًا فيه عرض الأسعار.
يؤدي اقتباس كل مفتاح أيضًا إلى إزالة الغموض حول المسافات والواصلات والكلمات المحجوزة. قد يتطلب JavaScript صيغة مصدر مختلفة لهذه الحالات، ولكن JSON يستخدم قاعدة واحدة ثابتة: `"display-name"`، و`"first name"`، و`"default"` كلها أسماء أعضاء عادية. المفاتيح ذات المظهر الرقمي هي سلاسل أيضًا.
القيم JSON ببساطة لا تملك
القيم JSON ببساطة لا تحتوي على — مفردات القيمة الخاصة بها هي الكائن والمصفوفة والسلسلة والرقم و`true` و`false` و`null`. لا توجد `undefined`، `NaN`، `Infinity`، وظيفة، تعبير عادي، BigInt أو تاريخ حرفي. التعليقات غائبة عن القواعد النحوية، ولا يمكن للأرقام استخدام العلامات السداسية العشرية أو الثنائية أو علامات الجمع البادئة أو JavaScript الفواصل الرقمية. تصل كل بنية مستعارة في النهاية إلى حرف لا يمكنه بدء قيمة JSON صالحة أو الاستمرار فيها.
يتطلب التحويل قرارًا يتعلق بالبيانات وليس خدعة إملائية. استبدل `undefined` بـ `null` فقط إذا كانت القيمة الفارغة الصريحة تتطابق مع عقد التطبيق؛ وإلا قم بإزالة العضو أو تقديم قيمة حقيقية. قم بتشفير التواريخ كسلاسل متفق عليها، غالبًا ISO 8601. تمثيل الأعداد غير المحدودة وفقًا لاستقبال API بدلاً من اختراع رمز مميز JSON.
مثال عملي: تحويل تفريغ وحدة التحكم إلى JSON صالح
مثال عملي: تحويل تفريغ وحدة التحكم إلى JSON صالح - ابدأ بـ `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. اقتباس `name`، `active`، `score` و `updated` مع علامات الاقتباس المزدوجة. قم بتغيير قيمة الاسم إلى سلسلة ذات علامات اقتباس مزدوجة. قرر أن النتيجة غير المتاحة يجب أن تكون `null`، واستبدل تعبير المُنشئ بسلسلة الطابع الزمني الفعلية التي كان من المفترض إنتاجها. يحتوي المستند الآن على JSON فقط من الأعضاء والقيم.
قد يكون الشكل النهائي `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`. قم بالتحقق من الصحة بعد كل فئة من فئات الإصلاح لأن الخطأ الأول يمكن أن يخفي لاحقًا بناء الجملة JavaScript فقط. يؤدي تنسيق النتيجة المقبولة إلى كشف بنيتها دون إجراء أي تحويل إضافي.
المصيدة العكسية — صالحة JSON والتي يمكن لـ JavaScript قراءتها بشكل مختلف، مثل الأعداد الصحيحة الكبيرة جدًا ومفتاح __proto__
الملاءمة العكسية - لا يزال بإمكان JSON الصالح اكتساب سلوك أو قيود خاصة بـ JavaScript بعد التحليل. لا تتضمن أرقام JSON حدًا مدمجًا للدقة في القواعد النحوية، ولكن JSON.parse تنتج JavaScript قيمًا رقمية. وبالتالي يمكن تقريب العدد الصحيح الذي يتجاوز النطاق الآمن بصمت. إذا كان كل رقم مهمًا، فقم بتشفير المعرف كسلسلة أو استخدم محللًا ونوع بيانات مصممًا للحفاظ على أرقام الدقة العشوائية بدلاً من الثقة في التحقق من بناء الجملة بنجاح.
اسم العضو `"__proto__"` صالح أيضًا JSON ويقوم JSON.parse بإنشائه كخاصية بيانات خاصة. يمكن أن تبدأ المشكلة لاحقًا إذا قام كود التطبيق بنسخ الخصائص التي تم تحليلها إلى كائن آخر مع تعيين غير آمن أو سلوك دمج. يثبت التحقق من الصحة أن النص يتبع قواعد JSON؛ ولا يثبت أن كل مفتاح آمن لكل مستهلك.
ما لا يغطيه هذا
ما لا يغطيه هذا — JSON5، JSONC ولغات التكوين التي تقبل عمدًا التعليقات أو الفواصل اللاحقة أو الأسماء غير المقتبسة أو السلاسل ذات علامات الاقتباس المفردة. تعمل هذه التنسيقات على حل مشكلات التأليف المختلفة وتحتاج إلى محللين ينفذون القواعد النحوية الخاصة بهم. يجب ألا يقوم المدقق الصارم JSON بإعادة تفسيرها بصمت، لأن قبول بناء الجملة الإضافي من شأنه أن يجعل نتائجه مضللة لواجهات برمجة التطبيقات وبيانات تعريف الحزمة والوجهات الأخرى التي تتطلب حقًا المعيار JSON.
يستثني هذا التمييز أيضًا التقييم التعسفي JavaScript. تشغيل النص الملصق من خلال `eval` أو منشئ الوظيفة فقط لتحويل كائن حرفي إلى بيانات يمكن أن يؤدي إلى تنفيذ حروف أو استدعاءات أو تعبيرات معادية أخرى. إذا كان المصدر موثوقًا به JavaScript تحت سيطرتك، فقم بإجراء تسلسل للقيمة الفعلية باستخدام JSON.stringify. إذا كان المصدر نصًا غير موثوق به، فلا تقم بتنفيذه.
الوجبات الجاهزة: الحرفي هو الكود، JSON هو البيانات
الخلاصة: الحرفي هو الكود، JSON هو البيانات - التشابه البصري لا يجعل القواعد النحوية قابلة للتبادل. JSON يتطلب سلاسل ذات علامات اقتباس مزدوجة وأسماء أعضاء، ولا يسمح إلا بمجموعة صغيرة ثابتة من أنواع القيم ولا يحتوي على تعليقات أو تعبيرات قابلة للتنفيذ. يمثل تشخيص السطر والعمود أول مكان يترك فيه المصدر المنسوخ القواعد النحوية. يعد إصلاح هذه النقطة والتحقق من صحتها مرة أخرى أكثر موثوقية من تطبيق عملية بحث واستبدال واسعة النطاق على تفريغ وحدة التحكم.
عندما تتحكم في القيمة JavaScript، قم بإنشاء JSON باستخدام JSON.stringify بدلاً من نسخ تمثيل وحدة التحكم الخاصة بها. عندما تتلقى نصًا، قم بتحليله فقط باستخدام المحلل اللغوي لتنسيقه المعلن ولا تقم مطلقًا بتنفيذه كاختصار. يؤدي التحقق الناجح من JSON إلى إنشاء بناء الجملة، وليس الدقة الرقمية، أو توافق المخطط أو المعالجة الآمنة للخصائص النهائية.