YAML
2 أدوات
تنسيقات تسلسل البيانات
تسلسل البيانات هو عملية تحويل البيانات المهيكلة إلى تنسيق يمكن تخزينه أو نقله وإعادة بنائه لاحقاً. تتفاوت التنسيقات المختلفة في موازناتها بين قابلية القراءة البشرية، وقدرة الآلة على التحليل، والتعبيرية، وحجم الملف.
JSON وYAML وTOML وXML هي التنسيقات الأربعة النصية السائدة لتسلسل البيانات في تطوير البرمجيات. لكل منها مزايا تجعله الخيار الأمثل في سياقات معينة — وفهم هذه الموازنات يتيح لك اختيار التنسيق المناسب لكل مهمة.
JSON وYAML جنباً إلى جنب
يمثّل JSON وYAML نموذج البيانات ذاته. YAML هو مجموعة شاملة صارمة من JSON — أي مستند JSON صالح هو أيضاً مستند YAML صالح. فيما يلي نفس الإعداد معبراً عنه بكلا التنسيقين:
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
},
"database": {
"url": "postgres://localhost/mydb",
"pool": 10
}
}server: host: localhost port: 8080 debug: true database: url: postgres://localhost/mydb pool: 10
يستخدم YAML المسافة البادئة بدلاً من الأقواس المعقوفة والمربعة، ويحذف علامات الاقتباس من معظم قيم السلاسل النصية. هذا يجعله أكثر إيجازاً وقابلية للقراءة في الملفات التي يحررها البشر، لكنه يُدخل حساسية للمسافة البادئة.
مقارنة التنسيقات
| التنسيق | قابلية القراءة | التعليقات | المصفوفات | الأنسب لـ |
|---|---|---|---|---|
| JSON | ★★★☆☆ | لا تعليقات | أصلي | APIs، تبادل البيانات |
| YAML | ★★★★★ | نعم (#) | أصلي | ملفات الإعداد، IaC |
| TOML | ★★★★☆ | نعم (#) | أصلي | إعداد التطبيق (Rust، Python) |
| XML | ★★☆☆☆ | نعم (<!-- -->) | عناصر متكررة | المستندات، SOAP، SVG |
مزالق YAML الشائعة
YAML قوي لكنه يحتوي على حالات حافة معروفة تُفاجئ المطورين. إليك الأكثر شيوعاً:
تُفسَّر القيمة المجردة 'NO' كقيمة منطقية false في YAML 1.1. رموز الدول مثل NO (النرويج) وOFF وFALSE وN تُحلَّل جميعها كـ false. في YAML 1.2 تم إصلاح هذا، لكن كثيراً من المحللات لا تزال تستخدم قواعد 1.1. اقتبس دائماً السلاسل النصية الغامضة.
يستخدم YAML المسافة البادئة لتعريف البنية. مسافة إضافية واحدة أو حرف tab يمكنه تغيير معنى المستند كلياً. Tab محظور كمسافة بادئة في YAML — المسافات فقط.
القيم المجردة التي تبدو كأرقام أو قيم منطقية أو null تُحوَّل تلقائياً. '1.0' تصبح عدداً عشرياً، و'2024-01-01' تصبح كائن تاريخ في بعض المحللات. اقتبس القيم التي تريد الاحتفاظ بها كسلاسل نصية.
تحظر مواصفة YAML صراحةً استخدام حرف tab كمسافة بادئة. المحررات التي تحوّل المسافات إلى tabs تلقائياً ستُتلف ملف YAML دون أي تحذير. اضبط محررك على استخدام المسافات في ملفات YAML.
يملك YAML مؤشرَين للسلاسل متعددة الأسطر: | (كتلة حرفية، تحفظ فواصل الأسطر) و> (كتلة مطوية، تحوّل فواصل الأسطر إلى مسافات). الخلط بينهما يُنتج مخرجات خاطئة دون أي تحذير.
تتيح مراسي YAML (&) والمراجع (*) إعادة استخدام العقد، وهو أمر قوي لكنه قد يُنشئ مراجع دائرية تسبب حلقات لا نهائية أو استنفاد الذاكرة في المحللات البسيطة. تحقق من صحة مستندات YAML المرسّاة من مصادر غير موثوقة.
ميزات حصرية في YAML
التعليقات
يدعم YAML التعليقات باستخدام الرمز #. هذه إحدى أكبر المزايا العملية على JSON في ملفات الإعداد — يمكنك توثيق إعداداتك بشكل مضمّن. يمكن أن تظهر التعليقات على سطر منفصل أو بعد قيمة.
المراسي والمراجع
يتيح YAML تعريف عقدة مرة واحدة باستخدام &اسم-المرساة وإعادة استخدامها في أي مكان باستخدام *اسم-المرساة. هذا يُلغي التكرار في الإعدادات المعقدة. تستخدم Kubernetes وDocker Compose المراسي بكثافة لتعريفات الخدمات المشتركة.
السلاسل النصية متعددة الأسطر
يدعم YAML الكتل القياسية بوضعين: الكتلة الحرفية (|) تحفظ فواصل الأسطر كما هي، وهي مفيدة للسكريبتات والقوالب. الكتلة المطوية (>) تدمج السلاسل الطويلة في سطر واحد، وهي مفيدة للأوصاف النصية المطوّلة.
متى تحتاج إلى التحويل
تستخدم GitHub Actions وGitLab CI وCircleCI صيغة YAML بشكل أصلي. عند توليد إعدادات خطوط العمل برمجياً، كثيراً ما يكون من الأسهل بناء كائن JSON ثم تحويله إلى YAML للمخرجات النهائية.
تُعرَّف موارد Kubernetes بصيغة YAML، لكن قوالب Helm وبعض الأدوات تُخرج JSON. يتيح التحويل بين التنسيقين فحص استجابات API واستخدام أدوات JSON القياسية.
تُرجع REST APIs بيانات JSON. عند تغذية تلك البيانات إلى أنظمة إعداد تعتمد YAML (كـ Ansible وSalt وKubernetes)، يُجسّر المحوّل الفجوة دون إعادة تنسيق يدوية.
كثيراً ما يعني الانتقال من أداة إلى أخرى تحويل تنسيق إعداداتها. يتيح التحويل بين JSON وYAML الانتقال بين البيئات (Node.js → Python، Docker → Kubernetes) بسرعة.
أدوات JSON Schema أكثر نضجاً من أدوات YAML Schema. النمط الشائع هو تأليف الإعداد بصيغة YAML لتسهيل القراءة، ثم تحويله إلى JSON للتحقق من صحته أمام مخطط ما، ثم إعادة تحويله للنشر.
قد تستهلك الأدوات الداخلية ملفات YAML بينما تتطلب APIs الخارجية JSON. يُبقي المحوّل في خط البناء كلتا الصياغتين متزامنتين دون الحاجة إلى الاحتفاظ بملفات مكررة.
الأسئلة الشائعة
نعم. YAML 1.2 هو مجموعة شاملة صارمة من JSON — أي مستند JSON صالح هو أيضاً مستند YAML صالح. غير أن YAML 1.1 (الذي لا تزال تستخدمه كثير من المحللات) يحتوي على حالات حافة قليلة حيث لا يكون JSON الصالح صالحاً بقواعد YAML 1.1.
يدعم YAML التعليقات بينما لا يدعمها JSON. كما أن YAML أكثر إيجازاً للبنى العميقة المتداخلة. هاتان الخاصيتان تجعلانه الخيار المفضل لملفات الإعداد التي يحررها البشر (Docker وKubernetes وGitHub Actions).
TOML (Tom's Obvious Minimal Language) مصمم لملفات الإعداد. يمتلك صياغة واضحة شبيهة بـ INI مع أنواع صريحة وبلا غموض. وهو المعيار لمشاريع Rust (Cargo.toml) وPython (pyproject.toml).
نادراً ما يحدث هذا، لكنه وارد. يحتفظ JSON بترتيب المفاتيح في معظم المحللات (رغم أن المواصفة تقول أنه غير مرتب). يدعم YAML مراسي ووسوماً لا يقابلها شيء في JSON. لضمان سلامة البيانات عند التحويل ذهاباً وإياباً، التزم بالمجموعة الفرعية المشتركة.
يحوّل JSON.stringify القيم undefined إلى null في المصفوفات ويحذفها من الكائنات. إذا رأيت قيم null غير متوقعة أو مفاتيح مفقودة في مخرجات JSON، فمن المرجح أن كائن JavaScript المصدر كان يحتوي على خصائص undefined.
نعم. لأن YAML هو مجموعة شاملة من JSON، يمكنك تضمين صياغة JSON مباشرةً داخل مستند YAML. يُفعَل هذا أحياناً للبنى المتداخلة المعقدة حيث قد تكون مسافات YAML البادئة مربكة.