تبدیل XML ↔ JSON چیست؟
XML (زبان نشانهگذاری توسعهپذیر) یک فرمت متنی مبتنی بر تگ برای دادههای سلسلهمراتبی است. آن را در سرویسهای وب SOAP، فیدهای RSS و Atom، رکوردهای سلامت HL7 FHIR، فایلهای sitemap.xml و فایلهای پیکربندی Maven، Spring و Android Gradle میبینید. JSON (نمادگذاری شیء JavaScript، تعریفشده توسط RFC 8259) همان نوع داده تودرتو را با آکولاد و آرایه به جای تگهای باز و بسته توصیف میکند. JSON چیزی است که تقریباً هر REST API امروز صحبت میکند و شکل مقدار بومی هر مرورگر است. تبدیل بین این دو فرمت یکی از آن کارهایی است که تا وقتی به ویژگیها، محتوای مختلط، فرزندان تکراری و CDATA نرسیدید، پیشپاافتاده به نظر میرسد. یک regex سفارشی پاسخ غلط است؛ یک پارسر واقعی پاسخ درست است. این ابزار یک پارسر واقعی (fast-xml-parser) ارسال میکند و آن را در مرورگر شما اجرا میکند.
نگاشت XML ↔ JSON چگونه کار میکند؟
هر تبدیل به صورت محلی در مرورگر شما با استفاده از کتابخانه fast-xml-parser همراهشده (MIT، نسخه ۴.x) اجرا میشود. قوانین نگاشت سطح بالا:
- عنصر به کلید: هر نام عنصر XML به یک کلید شیء JSON تبدیل میشود.
<user><name>Alice</name></user>به{"user":{"name":"Alice"}}نگاشت میشود. - ویژگی به کلید پیشونددار: یک ویژگی تحت کلیدی که با پیشوند انتخابی تشکیل میشود ذخیره میشود. با پیشوند
@،<user id="1">تولید میکند{"user":{"@id":"1"}}. - محتوای متن به کلید گره متن: وقتی یک عنصر هم ویژگی دارد هم متن، متن تحت کلید گره متن انتخابی قرار میگیرد.
<price currency="USD">9.99</price>با کلید#textتولید میکند{"price":{"@currency":"USD","#text":"9.99"}}. - فرزندان تکراری به آرایه: وقتی آرایه اجباری برای تگهای فرزند تکراری روشن است، چندین عنصر همسطح با همان نام در یک آرایه JSON جمع میشوند.
<items><item>A</item><item>B</item></items>به{"items":{"item":["A","B"]}}تبدیل میشود. - بخشهای CDATA: متن خام داخل
<![CDATA[…]]>تحت کلید#cdataحفظ میشود تا کاراکترهای آکولاد زاویهای و علامتهای & در حین دور برگشت دوباره escape نشوند. - JSON به XML نگاشت را معکوس میکند: کلیدهای شیء به عناصر تبدیل میشوند، کلیدهای پیشونددار به ویژگیها تبدیل میشوند، و آرایهها به عناصر همسطح تکراری گسترش مییابند.
چرا با این ابزار XML و JSON را تبدیل کنیم؟
- دادههای شما روی دستگاه شما میمانند. هر تجزیه و هر ساخت در context JavaScript این صفحه اجرا میشود. بستههای بیمار FHIR، پاکتهای احراز هویت SOAP، فایلهای پیکربندی اختصاصی، خروجیهای صورتحساب — هیچکدام به سرورهای ما دست نمیزنند، چون هیچ مرحله آپلودی در مسیر کد وجود ندارد. پانل شبکه را باز کنید و ببینید.
- SOAP legacy به یک frontend REST-first رایجترین درخواستی است که میشنویم. یک بانک یا شرکت بیمه یک endpoint SOAP را در معرض دید قرار میدهد که سالها بازنشسته نمیشود؛ اپلیکیشن React یا Vue که آن را صدا میزند نمیخواهد XML یاد بگیرد. پاکت را پیست کنید، JSON را با ویژگیهای پیشونددار و فضاهای نامی حفظشده برگردانید، محتوای
Bodyرا به state store خود بیاندازید. - مصرفکنندگان RSS، Atom و sitemap هم استفاده میکنند. یک دایرکتوری پادکست، یک جمعآور اخبار یا یک داشبورد داخلی که
sitemap.xmlرا دریافت میکند میتواند نوشتن یک پارسر XML را کاملاً نادیده بگیرد. فید را یک بار تبدیل کنید، با آرایه JSON کار کنید و کد کلاینت شما در زبانی که از قبل صحبت میکند باقی میماند. - خروجی پیکربندی فهرست را کامل میکند. Maven، Spring، Android Gradle و build های قدیمی Ant همه XML منتشر میکنند؛ ابزار cloud-native در طرف دیگر (Terraform، Ansible، GitHub Actions، cloud-init) JSON یا YAML میخواند. به جای اجرای یک اسکریپت Python با یک وابستگی شخص ثالث در مرورگر تبدیل کنید، بهویژه مفید در محیطهای air-gapped که پیست کردن در یک سرویس وب ناشناخته مجاز نیست.
کاربردهای رایج تبدیل XML ↔ JSON چیست؟
اتصال XML و JSON در مهندسی یکپارچهسازی، ابزار API و مهندسی داده مطرح میشود. چند الگو بار کاری را تسلط میدهند:
- اتصال SOAP به REST: استخراج payload
Bodyاز یک پاکت SOAP که توسط یک API بانکی یا بیمهای legacy برگردانده شده و تبدیل آن به JSON تا یک frontend React یا Vue بدون لایه proxy سمتسرور آن را مصرف کند. - رکوردهای سلامت FHIR: تبدیل بستههای XML HL7 FHIR به JSON برای بارگذاری در یک collection MongoDB Atlas یا یک ستون PostgreSQL JSONB که تحلیلگران میتوانند پرسوجو کنند.
- پردازش sitemap و feed: تبدیل یک
sitemap.xmlیا یک فید RSS/Atom به یک آرایه JSON تا یک indexer سفارشی، یک bot Slack یا یک widget داشبورد بتواند بدون وابستگی به یک پارسر XML روی ورودیها تکرار کند.
یک دور برگشت XML ↔ JSON چه شکلی است؟
یک مثال کوچک را در نظر بگیرید. <user id="1"><name>Alice</name></user> را در ورودی پیست کنید، پیشوند ویژگی را روی @ تنظیم کنید، حالت را روی XML به JSON بگذارید و Convert را فشار دهید. خروجی {"user":{"@id":"1","name":"Alice"}} است. حالت را به JSON به XML تغییر دهید، آن JSON را دوباره پیست کنید، تورفتگی را روی ۲ فاصله تنظیم کنید و دوباره Convert را فشار دهید. <user id="1">\n <name>Alice</name>\n</user> را دریافت میکنید که از نظر ساختاری با اصل یکسان است. تنها چیزی که در طول دور برگشت تضمین نمیشود ترتیب ویژگی است، چون کلیدهای شیء JSON طبق مشخصات نامرتب هستند.
این مبدل XML ↔ JSON با fast-xml-parser@4 بستهشده در همان مبدأ عرضه میشود، ویژگیها، CDATA، تگهای فرزند تکراری و پیشوندهای فضای نامی را مدیریت میکند، و وقتی صفحه بارگذاری شد به صورت آفلاین هم کار میکند. هیچ مرحله آپلود، هیچ CDN proxy، هیچ بیکن analytics، هیچ نوع telemetryای وجود ندارد. هر بایت ورودی و خروجی در مرورگر شما میماند، که دقیقاً همان چیزی است که میخواهید وقتی payload یک بسته بیمار FHIR، یک پاکت احراز هویت SOAP یا هر شکل دیگری از دادهای است که هیچکس خارج از تیم شما نباید ببیند.