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★★★☆☆بدون توضیحبومی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' در برخی تجزیه‌گرها به شیء تاریخ تبدیل می‌شود. مقادیری که می‌خواهید رشته بمانند را نقل‌قول بزنید.

Tab ممنوع است

مشخصات YAML به صراحت کاراکترهای tab را برای تورفتگی ممنوع می‌کند. ویرایشگرهایی که فاصله‌ها را به طور خودکار به tab تبدیل می‌کنند، فایل YAML شما را بدون اطلاع خراب می‌کنند. ویرایشگر خود را برای استفاده از فاصله در فایل‌های YAML تنظیم کنید.

حالت‌های رشته چندخطی

YAML دو نشانگر رشته چندخطی دارد: | (بلوک تحت‌الفظی، خط جدید را حفظ می‌کند) و > (بلوک تا شده، خط جدید را به فاصله تبدیل می‌کند). اشتباه گرفتن آن‌ها بی‌سروصدا خروجی نادرست تولید می‌کند.

لنگرها، نام‌های مستعار و ارجاع دایره‌ای

لنگرهای YAML (&) و نام‌های مستعار (*) امکان استفاده مجدد از گره را فراهم می‌کنند، که قدرتمند است اما می‌تواند ارجاعات دایره‌ای ایجاد کند که باعث حلقه‌های بی‌نهایت یا اتمام حافظه در تجزیه‌گرهای ساده می‌شود. YAML دریافتی از منابع غیرمعتمد که شامل لنگر است را همیشه اعتبارسنجی کنید.

ویژگی‌های منحصربه‌فرد YAML

توضیحات

YAML از توضیحات با کاراکتر # پشتیبانی می‌کند. این یکی از بزرگ‌ترین مزایای عملی نسبت به JSON برای فایل‌های تنظیمات است — می‌توانید تنظیمات خود را به صورت درون‌خطی مستند کنید. توضیحات می‌توانند در خط جداگانه یا بعد از یک مقدار ظاهر شوند.

لنگرها و نام‌های مستعار

YAML به شما اجازه می‌دهد یک گره را یک بار با &anchor-name تعریف کنید و در هر جایی با *anchor-name از آن استفاده کنید. این تکرار را در تنظیمات پیچیده حذف می‌کند. Kubernetes و Docker Compose به طور گسترده از لنگرها برای تعاریف سرویس مشترک استفاده می‌کنند.

رشته‌های چندخطی

YAML از اسکالرهای بلوکی با دو حالت پشتیبانی می‌کند: بلوک تحت‌الفظی (|) خط جدید را دقیقاً همانطور که نوشته شده حفظ می‌کند، که برای اسکریپت‌ها و قالب‌ها مفید است. بلوک تا شده (>) رشته‌های طولانی را در یک خط قرار می‌دهد، که برای توضیحات متنی طولانی مفید است.

زمانی که نیاز به تبدیل دارید

پیکربندی pipeline های CI/CD

GitHub Actions، GitLab CI و CircleCI به طور بومی از YAML استفاده می‌کنند. هنگام تولید تنظیمات pipeline به صورت برنامه‌نویسی، اغلب ساده‌تر است که یک شیء JSON بسازید و برای خروجی نهایی به YAML تبدیل کنید.

manifest های Kubernetes

منابع Kubernetes در YAML تعریف می‌شوند، اما قالب‌بندی Helm chart و برخی ابزارها خروجی JSON دارند. تبدیل بین فرمت‌ها به شما امکان می‌دهد پاسخ‌های API را بررسی کنید و از ابزارهای استاندارد JSON استفاده کنید.

پردازش پاسخ API

REST API ها JSON برمی‌گردانند. هنگام انتقال آن داده‌ها به سیستم‌های تنظیمات مبتنی بر YAML (Ansible، Salt، Kubernetes)، یک مبدل شکاف را بدون قالب‌بندی دستی پر می‌کند.

مهاجرت تنظیمات

مهاجرت از یک ابزار به ابزار دیگر اغلب به معنای تبدیل فرمت تنظیمات آن است. تبدیل بین JSON و YAML به شما امکان می‌دهد به سرعت بین اکوسیستم‌ها (Node.js → Python، Docker → Kubernetes) جابه‌جا شوید.

گردش کار اعتبارسنجی Schema

ابزار JSON Schema بالغ‌تر از YAML Schema است. یک الگوی رایج این است که تنظیمات را در YAML برای خوانایی بنویسید، برای اعتبارسنجی در برابر schema به JSON تبدیل کنید، سپس برای استقرار برگردانید.

تبادل داده با API ها

ابزارهای داخلی ممکن است تنظیمات YAML مصرف کنند در حالی که API های خارجی به JSON نیاز دارند. یک مبدل در pipeline ساخت هر دو نمایش را بدون نگهداری فایل‌های تکراری همگام نگه می‌دارد.

پرسش‌های متداول

آیا 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) برای فایل‌های تنظیمات طراحی شده است. دارای نحو واضح شبیه 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 در آن‌ها گیج‌کننده می‌شود انجام می‌شود.