قالببند JSON
یک سند JSON کامل با کدگذاری UTF-۸ را اعتبارسنجی میکند و فقط فضای خالیای را بازنویسی میکند که JSON آن را بیاهمیت تعریف کرده است. خروجی خوانا و فشردهشده، ترتیب کلیدها، نامهای تکراری، escape های رشتهها و هر توکن عددی اصلی را حفظ میکند.
یک سند JSON با کدگذاری UTF-۸ تا ۲۵ مگابایت. بایتهای آن در همین تب مرورگر میمانند.
نتیجهها بدون تضمین درستی ارائه میشوند. روش و منابع در پایین صفحه منتشر شدهاند تا بتوانید محاسبه را بررسی کنید.
چگونگی کار
این ابزار چه چیزی را محاسبه میکند
JSON ساده به نظر میرسد، تا وقتی که یک قالببند دادهای را تغییر دهد که هرگز قرار نبود تفسیر شود. میانبر رایج JSON.stringify(JSON.parse(file)) است. خروجی مرتبی میدهد، اما هر عدد را از Number با نمایش binary۶۴ جاوااسکریپت عبور میدهد، نامهای تکراری اشیا را به یک مقدار فرومیکاهد و شکل نوشتاری تازهای برای escape ها و نماهای علمی انتخاب میکند.
این ابزار اعتبارسنجی را از بازنویسی جدا میکند. تجزیهگر JSON مرورگر ثابت میکند که کل منبع یک مقدار منطبق با استاندارد است. اسکنر دومی که عمداً کوچکتر است، توکنهای اصلی را کپی میکند و فقط فضای خالیای را تغییر میدهد که RFC ۸۲۵۹ آن را بیاهمیت میخواند.
روش
RFC ۸۲۵۹ یک متن JSON را بهصورت فضای خالی، یک مقدار و سپس فضای خالی تعریف میکند. مقدار میتواند شیء، آرایه، عدد، رشته، true، false یا null باشد. تنها نویسههای فضای خالی در این دستور زبان فاصله، تب، خطنو و بازگشت نورد هستند و پیرامون شش نویسهٔ ساختاری مجازند:
[ ] { } : ,
این به قالببند سطح ویرایش محدودی میدهد. بیرون از رشتهٔ نقلقولشده، آن چهار نویسهٔ فضای خالی قابل حذفاند. درون رشته، فاصله داده است و بکاسلش تعیین میکند که علامت نقلقول بعدی رشته را تمام میکند یا بخشی از آن است. بنابراین اسکنر دو بیت وضعیت نگه میدارد: درون رشته و نویسهٔ قبلی escape بود.
حالت خوانا پس از {، [ یا کامای غیرخالی یک خطنو و تورفتگی، پس از دونقطه یک فاصله، و پیش از بسته شدن هر شیء یا آرایهٔ غیرخالی یک خطنو درج میکند. حالت فشردهشده هیچ چیز درج نمیکند. هیچکدام از این دو حالت یک توکن ابتدایی را به مقدار زبان برنامهنویسی تبدیل نمیکند.
پیش از ادامهٔ مطلب
کدام قالببند برای عدد JSON ۹۰۰۷۱۹۹۲۵۴۷۴۰۹۹۳ امن است؟
سند را اعتبارسنجی کنید، سپس توکن عددی اصلی را به خروجی منتقل کنید. RFC ۸۲۵۹ به پیادهسازیها اجازه میدهد دقت عددی را محدود کنند و بازهٔ تعاملپذیر اعداد صحیح دقیق را در حدود ۲^۵۳ مشخص میکند؛ یک قالببند فضای خالی اصلاً نیازی به خرج کردن آن دقت ندارد.
یک نمونهٔ کارشده
منبع تکخطی این است:
{"invoice":9007199254740993,"notes":"keep two spaces","items":[true,null]}
با خوانا و ۲ فاصله، فایل دانلودشده دقیقاً این است:
{
"invoice": 9007199254740993,
"notes": "keep two spaces",
"items": [
true,
null
]
}
دو فاصلهٔ درون "keep two spaces" داده میمانند. شمارهٔ بزرگ فاکتور رقمهای اصلیاش را نگه میدارد. عمیقترین تودرتویی ۲ است: شیء ریشه سطح ۱ و آرایهٔ آن سطح ۲ است. آزمون فرمول بایتهای کامل خروجی، نام فایل، نوع MIME، شمار بایتها و عمقی را که در پنل نتیجه نشان داده میشود تأیید میکند.
چرا متن اعداد و ترتیب اشیا دستنخورده میمانند
RFC ۸۲۵۹ بزرگی و دقتی فراتر از گنجایش binary۶۴ را برای اعداد مجاز میداند و در عین حال یادآور میشود که اعداد صحیح از -(2^53)+1 تا (2^53)-1 بازهای است که پیادهسازیها معمولاً روی آن دقیقاً توافق دارند. قالببندی که 9007199254740993 را به binary۶۴ تبدیل کند ممکن است 9007199254740992 بنویسد. حذف یک شکست خط هرگز به آن تبدیل نیاز نداشته، پس این ابزار انجامش نمیدهد.
RFC همچنین میگوید نامهای شیء باید یکتا باشند، و سپس مستند میکند وقتی یکتا نباشند چه میشود: برخی تجزیهگرها آخرین مقدار را نگه میدارند، برخی شکست میخورند و برخی همهٔ تکراریها را نشان میدهند. به همین ترتیب یادآور میشود که کتابخانهها در اینکه ترتیب اعضا قابلمشاهده باشد یا نه تفاوت دارند. مرتبسازی یا حذف تکراریها ممکن است در یک گردشکار تخصصی پاکسازی داده مفید باشد، اما هیچکدام زیر دکمهای با برچسب قالببندی صادقانه نیست.
کاری که انجام نمیدهد
JSON نامعتبر را تعمیر نمیکند، نامهای بدون گیومهٔ اشیا را در گیومه نمیگذارد، کامنتها را حذف نمیکند، کامای انتهایی را نمیپذیرد، کلیدها را مرتب نمیکند و JSON۵ را تبدیل نمیکند. این عملیات به سیاستی برای ورودی مبهم نیاز دارند. اینجا ورودی بدشکل گزارش میشود و فایل اصلی دستنخورده میماند.
همچنین کدگذاری نویسهها را تغییر نمیدهد. JSON تعاملپذیر با UTF-۸ است و BOM ابتدایی UTF-۸ فقط به این دلیل پذیرفته میشود که RFC ۸۲۵۹ به تجزیهگرها اجازه میدهد آن را برای سازگاری نادیده بگیرند. برای بازیابی متن سادهٔ UTF-۱۶ شناختهشده، ابتدا بایتها را تبدیل کنید؛ از یک قالببند JSON نخواهید حدس بزند آن بایتها چه نویسههایی بودهاند.
مراحل انجام کار
- فایل را بهصورت UTF-۸ سختگیرانه بخوانید. یک نشانهٔ ترتیب بایت UTF-۸ در ابتدای فایل را برای سازگاری بپذیرید و مصرف کنید، اما آن را در نتیجه ننویسید.
- پیش از تولید فایل خروجی، سند کامل را بهعنوان یک مقدار JSON مطابق RFC ۸۲۵۹ اعتبارسنجی کنید. فایل خالی، UTF-۸ نامعتبر، محتوای اضافی در انتها یا اشیا، آرایهها، رشتهها، اعداد و نامهای لفظی بدشکل را رد کنید.
- منبع اعتبارسنجیشده را اسکن کنید و در این حین رشتههای نقلقولشده و escape های بکاسلش را دنبال کنید. درون رشته هر واحد کد را دقیقاً کپی کنید؛ بیرون رشته فقط فاصله، تب، بازگشت نورد (CR) و خطنو (LF) را کنار بگذارید.
- برای خروجی خوانا، تورفتگی انتخابشده را پس از باز شدن هر شیء یا آرایه و پس از هر کاما، یک فاصله پس از دونقطه، و یک خط با تورفتگی درست پیش از بسته شدن هر شیء یا آرایهٔ غیرخالی درج کنید. برای خروجی فشردهشده هیچ فضای خالی اختیاریای درج نکنید.
- متن بازنویسیشده را بهصورت UTF-۸ کدگذاری کنید، فقط در صورت انتخاب یک خطنوی پایانی اضافه کنید و یک فایل .json جدید ارائه دهید. هرگز توکنهای عددی را برای خروجی به مقادیر ممیز شناور تبدیل نکنید.
فرضها
- قالببندی همان متعارفسازی نیست. ترتیب اعضای شیء، نامهای تکراری، شکل نوشتاری اعداد و انتخاب escape های رشتهها همانطور که نویسنده نوشته میمانند، حتی جایی که تجزیهگر دیگری ممکن است آنها را نرمال یا ادغام کند.
- JSON که میان سامانههای مستقل مبادله میشود، طبق RFC ۸۲۵۹ با کدگذاری UTF-۸ است. UTF-۱۶ و صفحهکدهای قدیمی پیش از اعمال این دستور زبان، به مبدل جداگانهٔ کدگذاری متن تعلق دارند.
- تجزیهگر بومی JSON فقط بهعنوان اعتبارسنج سختگیر دستور زبان استفاده میشود. بایتهای قابل دانلود از یک اسکن توکننگهدار روی متن اصلی میآیند، نه از JSON.stringify.
- سقف ورودی ۲۵ مگابایت است. بازنویسی هر ۲۵۰٬۰۰۰ نویسه کنترل را واگذار میکند تا پیشرفت و لغو پاسخگو بمانند؛ خود اعتبارسنجی بومی عمداً به تجزیهگر بهینهشدهٔ مرورگر سپرده شده است.
پرسشهای رایج
آیا فایل JSON هنگام قالببندی از این دستگاه خارج میشود؟
خیر. رمزگشایی سختگیرانه، اعتبارسنجی دستور زبان، بازنویسی فضای خالی و ساخت فایل درون یک Worker در همین تب مرورگر انجام میشود. آزمون مرورگری تولیدشده یک فایل JSON واقعی میدهد و اگر استفاده از ابزار درخواستی به مبدأ دیگری بفرستد شکست میخورد.
آیا قالببندی میتواند عدد صحیحی را که جاوااسکریپت نمیتواند دقیق نمایش دهد گرد کند؟
اینجا نه. اعتبارسنج ممکن است دستور زبان را بررسی کند، اما نویسندهٔ خروجی بهجای سریالسازی یک Number جاوااسکریپت، نویسههای اصلی عدد را کپی میکند. بنابراین عدد صحیحی مانند ۹۰۰۷۱۹۹۲۵۴۷۴۰۹۹۳ همهٔ رقمهایش را نگه میدارد.
آیا نامهای تکراری در اشیا حذف میشوند؟
خیر. RFC ۸۲۵۹ برای تعاملپذیری نامهای یکتا را توصیه میکند، اما رفتار ناهمسان تجزیهگرها را هنگام وجود تکراریها هم شرح میدهد. این قالببند هر عضو را با ترتیب اصلیاش حفظ میکند تا قالببندی، آن تصمیم محصولی را بیسروصدا نگیرد.
آیا فشردهسازی فاصلهها یا شکست خطهای درون یک رشته را حذف میکند؟
خیر. رشتهٔ نقلقولشده پس از رمزگشایی UTF-۸ بایتبهبایت کپی میشود، از جمله فاصلههای معمولی و نویسههای کنترلی escape شده. فقط چهار نویسهٔ فضای خالی JSON که بیرون از رشته پیدا شوند اختیاریاند.
آیا قالببند کلیدها را مرتب میکند یا JSON متعارف میسازد؟
خیر. مرتبسازی ترتیب اعضا را تغییر میدهد و متعارفسازی شکل نوشتاری توکنها را هم عوض میکند. این ابزار یک وعدهٔ محدود دارد: سند را اعتبارسنجی کند و فقط فضای خالی بیاهمیت را تغییر دهد.