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 | ★★★☆☆ | بدون توضیح | بومی | API، تبادل داده |
| YAML | ★★★★★ | بله (#) | بومی | فایلهای تنظیمات، IaC |
| TOML | ★★★★☆ | بله (#) | بومی | تنظیمات برنامه (Rust، Python) |
| XML | ★★☆☆☆ | بله (<!-- -->) | عناصر تکراری | اسناد، SOAP، SVG |
تلههای رایج YAML
YAML قدرتمند است اما موارد لبهای شناختهشدهای دارد که توسعهدهندگان را غافلگیر میکنند. رایجترینها اینها هستند:
مقدار خام 'NO' در YAML 1.1 به عنوان بولین false تفسیر میشود. کدهای کشوری مانند NO (نروژ)، OFF، FALSE، N همگی به عنوان false تجزیه میشوند. در YAML 1.2 این مشکل برطرف شده، اما بسیاری از تجزیهگرها هنوز از قوانین 1.1 استفاده میکنند. رشتههای مبهم را همیشه نقلقول بزنید.
YAML از تورفتگی برای تعریف ساختار استفاده میکند. یک فاصله اضافی یا یک کاراکتر tab میتواند معنای یک سند را به طور کامل تغییر دهد. Tab به عنوان تورفتگی در YAML ممنوع است — فقط فاصله.
مقادیر خامی که شبیه اعداد، بولینها یا null به نظر میرسند به طور خودکار تبدیل میشوند. '1.0' به float تبدیل میشود، '2024-01-01' در برخی تجزیهگرها به شیء تاریخ تبدیل میشود. مقادیری که میخواهید رشته بمانند را نقلقول بزنید.
مشخصات YAML به صراحت کاراکترهای tab را برای تورفتگی ممنوع میکند. ویرایشگرهایی که فاصلهها را به طور خودکار به tab تبدیل میکنند، فایل YAML شما را بدون اطلاع خراب میکنند. ویرایشگر خود را برای استفاده از فاصله در فایلهای YAML تنظیم کنید.
YAML دو نشانگر رشته چندخطی دارد: | (بلوک تحتالفظی، خط جدید را حفظ میکند) و > (بلوک تا شده، خط جدید را به فاصله تبدیل میکند). اشتباه گرفتن آنها بیسروصدا خروجی نادرست تولید میکند.
لنگرهای YAML (&) و نامهای مستعار (*) امکان استفاده مجدد از گره را فراهم میکنند، که قدرتمند است اما میتواند ارجاعات دایرهای ایجاد کند که باعث حلقههای بینهایت یا اتمام حافظه در تجزیهگرهای ساده میشود. YAML دریافتی از منابع غیرمعتمد که شامل لنگر است را همیشه اعتبارسنجی کنید.
ویژگیهای منحصربهفرد YAML
توضیحات
YAML از توضیحات با کاراکتر # پشتیبانی میکند. این یکی از بزرگترین مزایای عملی نسبت به JSON برای فایلهای تنظیمات است — میتوانید تنظیمات خود را به صورت درونخطی مستند کنید. توضیحات میتوانند در خط جداگانه یا بعد از یک مقدار ظاهر شوند.
لنگرها و نامهای مستعار
YAML به شما اجازه میدهد یک گره را یک بار با &anchor-name تعریف کنید و در هر جایی با *anchor-name از آن استفاده کنید. این تکرار را در تنظیمات پیچیده حذف میکند. Kubernetes و Docker Compose به طور گسترده از لنگرها برای تعاریف سرویس مشترک استفاده میکنند.
رشتههای چندخطی
YAML از اسکالرهای بلوکی با دو حالت پشتیبانی میکند: بلوک تحتالفظی (|) خط جدید را دقیقاً همانطور که نوشته شده حفظ میکند، که برای اسکریپتها و قالبها مفید است. بلوک تا شده (>) رشتههای طولانی را در یک خط قرار میدهد، که برای توضیحات متنی طولانی مفید است.
زمانی که نیاز به تبدیل دارید
GitHub Actions، GitLab CI و CircleCI به طور بومی از YAML استفاده میکنند. هنگام تولید تنظیمات pipeline به صورت برنامهنویسی، اغلب سادهتر است که یک شیء JSON بسازید و برای خروجی نهایی به YAML تبدیل کنید.
منابع Kubernetes در YAML تعریف میشوند، اما قالببندی Helm chart و برخی ابزارها خروجی JSON دارند. تبدیل بین فرمتها به شما امکان میدهد پاسخهای API را بررسی کنید و از ابزارهای استاندارد JSON استفاده کنید.
REST API ها JSON برمیگردانند. هنگام انتقال آن دادهها به سیستمهای تنظیمات مبتنی بر YAML (Ansible، Salt، Kubernetes)، یک مبدل شکاف را بدون قالببندی دستی پر میکند.
مهاجرت از یک ابزار به ابزار دیگر اغلب به معنای تبدیل فرمت تنظیمات آن است. تبدیل بین JSON و YAML به شما امکان میدهد به سرعت بین اکوسیستمها (Node.js → Python، Docker → Kubernetes) جابهجا شوید.
ابزار JSON Schema بالغتر از YAML Schema است. یک الگوی رایج این است که تنظیمات را در YAML برای خوانایی بنویسید، برای اعتبارسنجی در برابر schema به JSON تبدیل کنید، سپس برای استقرار برگردانید.
ابزارهای داخلی ممکن است تنظیمات YAML مصرف کنند در حالی که API های خارجی به JSON نیاز دارند. یک مبدل در pipeline ساخت هر دو نمایش را بدون نگهداری فایلهای تکراری همگام نگه میدارد.
پرسشهای متداول
بله. YAML 1.2 یک فوقمجموعه کامل از JSON است — هر سند JSON معتبر، یک سند YAML معتبر نیز هست. با این حال، YAML 1.1 (که هنوز توسط بسیاری از تجزیهگرها استفاده میشود) چند موارد لبهای دارد که در آنها JSON معتبر، YAML 1.1 معتبر نیست.
YAML از توضیحات پشتیبانی میکند، در حالی که JSON این قابلیت را ندارد. YAML همچنین برای ساختارهای تو در تو فشردهتر است. این دو ویژگی آن را انتخاب مناسب برای فایلهای تنظیمات ویرایششده توسط انسان میکند (Docker، Kubernetes، GitHub Actions).
TOML (زبان حداقلی آشکار Tom) برای فایلهای تنظیمات طراحی شده است. دارای نحو واضح شبیه INI با نوعهای صریح و بدون ابهام است. این استاندارد برای پروژههای Rust (Cargo.toml) و Python (pyproject.toml) است.
به ندرت، اما ممکن است. JSON ترتیب کلیدها را در اکثر تجزیهگرها حفظ میکند (هرچند مشخصات میگوید بدون ترتیب است). YAML از لنگرها و برچسبهایی پشتیبانی میکند که معادل JSON ندارند. برای حفظ دقت در تبدیل دوطرفه، به زیرمجموعه مشترک پایبند باشید.
JSON.stringify مقادیر undefined را در آرایهها به null تبدیل میکند و آنها را از اشیاء حذف میکند. اگر null های غیرمنتظره یا کلیدهای گمشده در خروجی JSON مشاهده کردید، احتمالاً شیء JavaScript منبع حاوی خصوصیات undefined بوده است.
بله. از آنجا که YAML یک فوقمجموعه از JSON است، میتوانید نحو JSON را مستقیماً در داخل یک سند YAML جاسازی کنید. این گاهی برای ساختارهای تو در تو پیچیدهای که تورفتگی YAML در آنها گیجکننده میشود انجام میشود.