مرزهای تبدیل JSON ↔ YAML و XML
ادعای اینکه JSON زیرمجموعه YAML است فقط یک جهت را تضمین میکند و XML اصلاً نگاشت رسمی JSON ندارد — همه چیز بر قرارداد استوار است.
تبدیل میان JSON و YAML، XML، CSV، TypeScript، Java، Go و SQL هرگز بدون تلفات نیست. آنچه اهمیت دارد، صراحت درباره جای تلفات است.
8 مقالهادعای اینکه JSON زیرمجموعه YAML است فقط یک جهت را تضمین میکند و XML اصلاً نگاشت رسمی JSON ندارد — همه چیز بر قرارداد استوار است.
CSV دوبعدی است، JSON درختی. بخش دشوار تبدیل کد نیست — این است که از پیش تصمیم بگیرید آرایهها چگونه تخت شوند و نوعها چگونه حفظ شوند.
ساختارهای تودرتو، فیلدهای ناهمگون و آرایههای آرایه همان جاهایی هستند که تبدیل JSON به صفحهگسترده میشکند. چهار رویکرد به ترتیب زمان رسیدن به نتیجه، هر یک با معایب خود.
تبدیل JSON به INSERT SQL شکستن جدولهای تودرتو، NULL در برابر غایب، escape و شکاف گویشها را پنهان میکند. دستورهای قابل اجرا و جدول مقایسه برای هر تله.
تولید interface از JSON نمونه نیمی از کار است: فیلدهای اختیاری، null، unionها، تاریخها و عددهای صحیح بزرگ به بازبینی انسانی نیاز دارند و نوعها هیچ اعتبارسنجی زمان اجرا انجام نمیدهند.
رایجترین دستوری که در آموزشها تکرار میشود، yq -P input.json > output.yaml، در yq v4 همچنان JSON خروجی میدهد. این مقاله yq v4.44.6، PyYAML 6.0.3 و js-yaml را روی نمونهای 2.39 MB اندازه میگیرد، توضیح میدهد چرا پسوند ورودی قالب خروجی را تعیین میکند و دستور صحیح تبدیل دستهای، گیومهگذاری، تورفتگی و دقت اعداد صحیح بزرگ را میدهد.
نه آزمایش روی یک مبدل واقعی: راهبرد «کلیدهای رکورد اول» بیسروصدا فیلد گم میکند، null و غیبت و رشتهٔ خالی همه به خانههای خالی تبدیل میشوند، عدد صحیح ۲۰ رقمی همانجا در JSON.parse دقتش را از دست میدهد، و نقطه در یک کلید دو مسیر متفاوت را در یک ستون به برخورد میاندازد. سرصفحه چگونه ساخته میشود، کدام مقادیر تغییر شکل مییابند و چگونه بسته به مصرف پاییندستی راهبرد انتخاب کنید.
نگاهی عملی به آنچه یک مولد JSON-to-Java واقعاً تولید میکند — اعداد Double میشوند، اشیای تو در تو کلاسهای داخلی static میشوند و حتی یک حاشیهنویسی Jackson هم تولید نمیشود. دقت پولی، تغییر نام فیلدها، پاکشدن نوع، فیلدهای ناشناخته و تاریخها پنج چیزی هستند که باید خودتان اضافه کنید، هرکدام با کد آماده برای کپی.