ToolDeck

YAML

2 أدوات

تنسيقات تسلسل البيانات

تسلسل البيانات هو عملية تحويل البيانات المهيكلة إلى تنسيق يمكن تخزينه أو نقله وإعادة بنائه لاحقاً. تتفاوت التنسيقات المختلفة في موازناتها بين قابلية القراءة البشرية، وقدرة الآلة على التحليل، والتعبيرية، وحجم الملف.

JSON وYAML وTOML وXML هي التنسيقات الأربعة النصية السائدة لتسلسل البيانات في تطوير البرمجيات. لكل منها مزايا تجعله الخيار الأمثل في سياقات معينة — وفهم هذه الموازنات يتيح لك اختيار التنسيق المناسب لكل مهمة.

JSON وYAML جنباً إلى جنب

يمثّل JSON وYAML نموذج البيانات ذاته. YAML هو مجموعة شاملة صارمة من JSON — أي مستند JSON صالح هو أيضاً مستند YAML صالح. فيما يلي نفس الإعداد معبراً عنه بكلا التنسيقين:

JSON
{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "url": "postgres://localhost/mydb",
    "pool": 10
  }
}
YAML
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' تصبح كائن تاريخ في بعض المحللات. اقتبس القيم التي تريد الاحتفاظ بها كسلاسل نصية.

حرف Tab محظور

تحظر مواصفة YAML صراحةً استخدام حرف tab كمسافة بادئة. المحررات التي تحوّل المسافات إلى tabs تلقائياً ستُتلف ملف YAML دون أي تحذير. اضبط محررك على استخدام المسافات في ملفات YAML.

أوضاع السلاسل النصية متعددة الأسطر

يملك YAML مؤشرَين للسلاسل متعددة الأسطر: | (كتلة حرفية، تحفظ فواصل الأسطر) و> (كتلة مطوية، تحوّل فواصل الأسطر إلى مسافات). الخلط بينهما يُنتج مخرجات خاطئة دون أي تحذير.

الحلقات الدائرية في المراسي والمراجع

تتيح مراسي YAML (&) والمراجع (*) إعادة استخدام العقد، وهو أمر قوي لكنه قد يُنشئ مراجع دائرية تسبب حلقات لا نهائية أو استنفاد الذاكرة في المحللات البسيطة. تحقق من صحة مستندات YAML المرسّاة من مصادر غير موثوقة.

ميزات حصرية في YAML

التعليقات

يدعم YAML التعليقات باستخدام الرمز #. هذه إحدى أكبر المزايا العملية على JSON في ملفات الإعداد — يمكنك توثيق إعداداتك بشكل مضمّن. يمكن أن تظهر التعليقات على سطر منفصل أو بعد قيمة.

المراسي والمراجع

يتيح YAML تعريف عقدة مرة واحدة باستخدام &اسم-المرساة وإعادة استخدامها في أي مكان باستخدام *اسم-المرساة. هذا يُلغي التكرار في الإعدادات المعقدة. تستخدم Kubernetes وDocker Compose المراسي بكثافة لتعريفات الخدمات المشتركة.

السلاسل النصية متعددة الأسطر

يدعم YAML الكتل القياسية بوضعين: الكتلة الحرفية (|) تحفظ فواصل الأسطر كما هي، وهي مفيدة للسكريبتات والقوالب. الكتلة المطوية (>) تدمج السلاسل الطويلة في سطر واحد، وهي مفيدة للأوصاف النصية المطوّلة.

متى تحتاج إلى التحويل

إعداد خطوط CI/CD

تستخدم GitHub Actions وGitLab CI وCircleCI صيغة YAML بشكل أصلي. عند توليد إعدادات خطوط العمل برمجياً، كثيراً ما يكون من الأسهل بناء كائن JSON ثم تحويله إلى YAML للمخرجات النهائية.

ملفات تعريف Kubernetes

تُعرَّف موارد Kubernetes بصيغة YAML، لكن قوالب Helm وبعض الأدوات تُخرج JSON. يتيح التحويل بين التنسيقين فحص استجابات API واستخدام أدوات JSON القياسية.

معالجة استجابات API

تُرجع REST APIs بيانات JSON. عند تغذية تلك البيانات إلى أنظمة إعداد تعتمد YAML (كـ Ansible وSalt وKubernetes)، يُجسّر المحوّل الفجوة دون إعادة تنسيق يدوية.

ترحيل الإعدادات

كثيراً ما يعني الانتقال من أداة إلى أخرى تحويل تنسيق إعداداتها. يتيح التحويل بين JSON وYAML الانتقال بين البيئات (Node.js → Python، Docker → Kubernetes) بسرعة.

سير عمل التحقق من المخطط

أدوات JSON Schema أكثر نضجاً من أدوات YAML Schema. النمط الشائع هو تأليف الإعداد بصيغة YAML لتسهيل القراءة، ثم تحويله إلى JSON للتحقق من صحته أمام مخطط ما، ثم إعادة تحويله للنشر.

تبادل البيانات مع APIs

قد تستهلك الأدوات الداخلية ملفات YAML بينما تتطلب APIs الخارجية JSON. يُبقي المحوّل في خط البناء كلتا الصياغتين متزامنتين دون الحاجة إلى الاحتفاظ بملفات مكررة.

الأسئلة الشائعة

هل YAML مجموعة شاملة من JSON؟

نعم. YAML 1.2 هو مجموعة شاملة صارمة من JSON — أي مستند JSON صالح هو أيضاً مستند YAML صالح. غير أن YAML 1.1 (الذي لا تزال تستخدمه كثير من المحللات) يحتوي على حالات حافة قليلة حيث لا يكون JSON الصالح صالحاً بقواعد YAML 1.1.

لماذا أختار YAML على JSON لملفات الإعداد؟

يدعم YAML التعليقات بينما لا يدعمها JSON. كما أن YAML أكثر إيجازاً للبنى العميقة المتداخلة. هاتان الخاصيتان تجعلانه الخيار المفضل لملفات الإعداد التي يحررها البشر (Docker وKubernetes وGitHub Actions).

ما هو TOML ومتى أستخدمه؟

TOML (Tom's Obvious Minimal Language) مصمم لملفات الإعداد. يمتلك صياغة واضحة شبيهة بـ INI مع أنواع صريحة وبلا غموض. وهو المعيار لمشاريع Rust (Cargo.toml) وPython (pyproject.toml).

هل يفقد التحويل من JSON إلى YAML أي معلومات؟

نادراً ما يحدث هذا، لكنه وارد. يحتفظ JSON بترتيب المفاتيح في معظم المحللات (رغم أن المواصفة تقول أنه غير مرتب). يدعم YAML مراسي ووسوماً لا يقابلها شيء في JSON. لضمان سلامة البيانات عند التحويل ذهاباً وإياباً، التزم بالمجموعة الفرعية المشتركة.

ما الذي يُسبب ظهور 'undefined' في مخرجات JSON؟

يحوّل JSON.stringify القيم undefined إلى null في المصفوفات ويحذفها من الكائنات. إذا رأيت قيم null غير متوقعة أو مفاتيح مفقودة في مخرجات JSON، فمن المرجح أن كائن JavaScript المصدر كان يحتوي على خصائص undefined.

هل يمكنني استخدام JSON داخل ملف YAML؟

نعم. لأن YAML هو مجموعة شاملة من JSON، يمكنك تضمين صياغة JSON مباشرةً داخل مستند YAML. يُفعَل هذا أحياناً للبنى المتداخلة المعقدة حيث قد تكون مسافات YAML البادئة مربكة.