← همه ابزارها

تبدیل JSON به YAML

JSON را به YAML و YAML را به JSON فوری در مرورگر تبدیل کنید. فقط محلی پردازش می‌شود و هیچ داده‌ای آپلود نمی‌شود. تفاوت‌های فرمت را بدانید.

تبدیل JSON به YAML و YAML به JSON در مرورگر

JSON و YAML نوع یکسانی از داده را توصیف می‌کنند — نقشه‌های تودرتو، فهرست‌ها، رشته‌ها، اعداد و بولین‌ها — اما بسیار متفاوت به نظر می‌رسند و در جاهای متفاوتی استفاده می‌شوند. اگر وقتی نزدیک APIها، فایل‌های container یا pipeline‌های CI صرف می‌کنید، در نهایت نیاز دارید یکی را به دیگری تبدیل کنید. این صفحه آن تبدیل را در هر دو جهت، کاملاً درون مرورگرتان انجام می‌دهد، بنابراین داده‌هایی که جای‌گذاری می‌کنید هرگز دستگاهتان را ترک نمی‌کنند.

پرانتزهای انتزاعی نور که روی پس‌زمینه‌ای تیره به لایه‌های پیکربندی با تورفتگی تمیز تبدیل می‌شوند
ساختار JSON که به YAML مبتنی بر تورفتگی باز می‌شود.

JSON چیست و کجا زندگی می‌کند

JSON (JavaScript Object Notation) یک فرمت سختگیرانه پرانتز و بریس است که اول برای ماشین‌ها ساخته شده. هر شیء در {} پوشانده می‌شود، هر آرایه در []، کلیدها و مقادیر رشته با گیومه‌های دوتایی نقل می‌شوند، و آیتم‌ها با کاما جدا می‌شوند. فرمت پیش‌فرض سیم برای REST و GraphQL APIها، بدنه بیشتر وب‌هوک‌ها، شکل اسناد NoSQL و چیزی است که تابع fetch شما برمی‌گرداند. تقریباً هر زبانی آن را از پایه تجزیه می‌کند، که دقیقاً همین دلیل است که لایه API را برد: JSON.parse در JavaScript، json در کتابخانه استاندارد Python، و معادل‌ها در همه جای دیگر. مبادله این است که JSON برای نوشتن دستی پرحجم است و از کامنت‌ها پشتیبانی نمی‌کند، بنابراین فرمت ضعیفی برای فایل‌هایی است که انسان تمام روز ویرایش می‌کند.

YAML چیست و کجا زندگی می‌کند

YAML (YAML Ain't Markup Language) برای اولویت مخالف طراحی شده: اول انسان‌ها. بریس‌ها و گیومه‌ها را حذف می‌کند، از تورفتگی برای بیان تودرتویی استفاده می‌کند، و به شما اجازه می‌دهد کامنت‌ها را با # بنویسید. این خوانایی دلیلی است که به زبان مشترک پیکربندی تبدیل شد. فایل‌های Docker Compose، manifestهای Kubernetes، گردش‌کارهای GitHub Actions و GitLab CI، playbookهای Ansible، و بی‌شمار فایل پیکربندی اپ همه YAML هستند. یک سند YAML معمولی محسوساً کوتاه‌تر از JSON معادل است و در یک pull request بسیار آسان‌تر diff می‌شود. بهای آن ظرافت شکنندگی است، که جایی است که تبدیل جالب می‌شود.

تفاوت‌های کلیدی که برای تبدیل مهم هستند

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

درخت داده تودرتویی که بین دو فرمت ساختاریافته درخشان با رنگ‌های فیروزه‌ای و طلایی تبدیل می‌شود
همان درخت داده به دو فرمت بیان شده.

مشکلات تبدیل که باید مراقب آن‌ها بود

رفت و برگشت همیشه بی‌ضرر نیست، و ارزش دارد بدانید کجا چیزها خراب می‌شوند:

  • مشکل نروژ. طبق قوانین YAML 1.1، NO بدون گیومه به بولین false تجزیه می‌شود، و yes، on و off هم به بولین تبدیل می‌شوند. یک کد کشور یا برچسب کلید می‌تواند قبل از اینکه متوجه شوید به true/false برگردد. مقادیری را که منظورتان رشته است با گیومه احاطه کنید.
  • تبدیل اجباری عدد. یک نسخه مانند 3.10 می‌تواند صفر انتهایی‌اش را از دست بدهد و 3.1 شود، و 1.0 حتی وقتی متن می‌خواستید به عدد تبدیل می‌شود. رشته‌های نسخه و IDها را با گیومه مشخص کنید.
  • لنگرها و نام‌های مستعار ناپدید می‌شوند. مراجع &anchor و *alias YAML معادل JSON ندارند. یک مبدل خوب آن‌ها را به مقادیر کامل‌شان گسترش می‌دهد، بنابراین داده‌ها درست است اما حذف تکرار از بین رفته — JSON به YAML به JSON لنگرهای اصلی را بازنمی‌سازد.
  • کامنت‌ها و block scalar ها. کامنت‌ها هنگام رفتن به JSON حذف می‌شوند. block scalarهای چند خطی (| و >) به رشته‌های معمولی JSON با فرار \n فشرده می‌شوند، بنابراین قصد قالب‌بندی بصری از بین می‌رود.
  • تورفتگی وقتی به YAML برمی‌گردید. JSON تورفتگی را کدگذاری نمی‌کند، بنابراین مبدل یک سبک ثابت انتخاب می‌کند. قبل از جای‌گذاری در یک ابزار حساس به تب آن را مرور کنید.

چرا فقط محلی مهم است

فایل‌های پیکربندی و بارهای API دقیقاً نوعی چیزی هستند که نباید به یک سرور تصادفی آپلود شوند: اغلب نام هاست‌ها، توکن‌ها، نام سرویس‌های داخلی یا داده‌های مشتری را حمل می‌کنند. این مبدل مرحله تجزیه-و-انتشار را در مرورگر شما با JavaScript اجرا می‌کند. هیچ‌چیزی به backend ارسال نمی‌شود، هیچ‌چیزی ثبت نمی‌شود، و ابزار یک بار که صفحه بارگذاری شده به صورت آفلاین کار می‌کند. یک secret Kubernetes یا یک گردش‌کار CI را با اطمینان از اینکه روی دستگاهتان می‌ماند جای‌گذاری کنید.

به ابزار مرتبط نیاز دارید؟ مجموعه کامل مبدل‌های داده را ببینید، ورودی درهم و برهم را با قالب‌بندی‌کننده JSON مرتب کنید، و هر وقت نیاز داشتید بین دنیای API و دنیای پیکربندی جابجا شوید به اینجا برگردید.

سوالات متداول

آیا داده‌هایم جایی آپلود می‌شوند؟

خیر. تبدیل کاملاً در مرورگر شما با استفاده از JavaScript محلی انجام می‌شود. JSON یا YAML شما هرگز به سرور ارسال نمی‌شود، بنابراین secret‌ها و فایل‌های پیکربندی خصوصی می‌مانند.

چرا مقدار true یا false در YAML به طور غیرمنتظره‌ای تغییر کرد؟

YAML 1.1 کلماتی مانند yes، no، on و off بدون گیومه را به عنوان بولین تفسیر می‌کند — مشکل نروژ. هر مقداری که منظورتان رشته است را با گیومه احاطه کنید تا به عنوان متن از تبدیل سالم بیرون بیاید.

وقتی YAML را به JSON تبدیل می‌کنم چه اتفاقی برای کامنت‌هایم می‌افتد؟

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

آیا لنگرها و نام‌های مستعار YAML حفظ می‌شوند؟

آن‌ها به مقادیر کامل‌شان گسترش می‌یابند چون JSON مکانیزم مرجع ندارد. داده‌ها درست می‌مانند، اما حذف تکرار وقتی به YAML برمی‌گردید قابل بازیابی نیست.

آیا می‌توانم JSON را هم به YAML تبدیل کنم؟

بله، ابزار در هر دو جهت کار می‌کند. JSON را برای گرفتن YAML جای‌گذاری کنید، یا YAML را برای گرفتن JSON، و مبدل فرمت دیگر را تشخیص داده و منتشر می‌کند.

چرا YAML وقتی از تب استفاده می‌کنم خراب می‌شود؟

YAML برای تورفتگی از فاصله‌ها استفاده می‌کند و تب‌ها را رد می‌کند. اگر یک paste تجزیه نشد، کاراکترهای تب را با فاصله‌ها جایگزین کنید و تورفتگی را ثابت نگه دارید.