فایلهای JSON در حالت توسعه معمولاً با تورفتگی، فاصله و خطهای متعدد ذخیره میشوند تا خواندن و بازبینی آنها ساده باشد. همین قالب خوانا وقتی قرار است در شبکه ارسال شود، داخل یک فایل ثابت قرار بگیرد یا بهعنوان خروجی یک API تحویل داده شود، بایتهای اضافه تولید میکند. JSON Minify فرایندی است که فاصلهها و شکستخطهای غیرضروری را حذف میکند، بدون اینکه ساختار یا مقدار داده تغییر کند.
Quick Answer: JSON Minify یعنی حذف whitespaceهای غیرضروری بیرون از Stringها و تولید یک نمایش فشرده از همان داده. Minify میتواند حجم متن JSON را کاهش دهد، اما میزان کاهش به مقدار تورفتگی و نسبت کلیدها و مقدارهای واقعی بستگی دارد. این عملیات با فشردهسازی gzip، رمزنگاری، اعتبارسنجی یا حذف داده یکسان نیست.
JSON Minify چیست؟
در JSON، فاصله، tab و خط جدید بین Tokenها معمولاً برای Parser اهمیتی ندارند. برای نمونه، دو قطعه زیر پس از Parse شدن یک ساختار یکسان میسازند:
{
"name": "Sara",
"active": true,
"roles": [
"editor",
"reviewer"
]
}
{"name":"Sara","active":true,"roles":["editor","reviewer"]}
نسخه دوم Minified است. کلیدها، مقدارها، ترتیب Array و نوع دادهها حفظ شدهاند و فقط فاصلههای نمایشی حذف شدهاند. ابزار Minifier باید ابتدا ورودی را بهصورت امن Parse کند و سپس آن را با تنظیمات بدون تورفتگی Serialize کند.
چه بخشهایی در Minify حذف میشوند؟
- فاصلههای میان کلید، دونقطه و مقدار
- فاصلههای بعد از کاما
- خطهای جدید و تورفتگیهای نمایشی
- فاصلههای ابتدا و انتهای سند
اما فاصلهای که داخل String قرار دارد بخشی از داده است و نباید حذف شود. مقدار "New York" با "NewYork" متفاوت است. Minifier فقط whitespace بیرون از String را حذف میکند.
JSON Minify چه تفاوتی با JSON Formatter دارد؟
| ویژگی | JSON Minify | JSON Formatter |
|---|---|---|
| هدف | کاهش حجم نمایش متنی | افزایش خوانایی |
| تورفتگی | حذف میشود | اضافه یا منظم میشود |
| خط جدید | حذف میشود | براساس ساختار اضافه میشود |
| مقدار داده | نباید تغییر کند | نباید تغییر کند |
| کاربرد | انتقال، ذخیره و Embed | Debug، Review و آموزش |
Formatter و Minifier دو نمایش متفاوت از یک ساختار هستند. در چرخه توسعه میتوان داده را Format کرد و قبل از ارسال یا انتشار آن را Minify کرد.
JSON Minify با فشردهسازی چه تفاوتی دارد؟
Minify متن را همچنان بهعنوان JSON قابل خواندن نگه میدارد و فقط whitespace را حذف میکند. فشردهسازیهایی مانند gzip یا Brotli الگوهای تکراری را به بایتهای فشرده تبدیل میکنند و خروجی دیگر متن JSON مستقیم نیست. در انتقال HTTP معمولاً بهترین نتیجه از ترکیب هر دو بهدست میآید: ابتدا Serialization بدون تورفتگی و سپس Compression در لایه انتقال.
| روش | خروجی | قابل Parse مستقیم بهعنوان JSON؟ | کاهش حجم معمول |
|---|---|---|---|
| Minify | متن JSON | بله | وابسته به whitespace |
| gzip/Brotli | داده فشرده | پس از Decompress | معمولاً بیشتر |
| حذف فیلدها | JSON با داده کمتر | بله | ممکن است معنا را تغییر دهد |
JSON Minify چقدر حجم را کاهش میدهد؟
یک درصد ثابت برای همه فایلها وجود ندارد. اگر فایل با چهار فاصله تورفتگی و هر Property در یک خط نوشته شده باشد، کاهش میتواند محسوس باشد. اگر JSON از ابتدا در یک خط باشد، Minify تقریباً تغییری ایجاد نمیکند. فایلهایی با Objectهای عمیق و Arrayهای طولانی معمولاً whitespace بیشتری دارند.
برای محاسبه دقیق، حجم UTF-8 ورودی و خروجی را مقایسه کنید:
const before = new TextEncoder().encode(prettyJson).length;
const after = new TextEncoder().encode(minifiedJson).length;
const savedPercent = ((before - after) / before) * 100;
تعداد کاراکتر با تعداد بایت همیشه برابر نیست؛ کاراکترهای فارسی در UTF-8 چندبایتی هستند. بنابراین برای گزارش شبکه، تعداد بایت معیار دقیقتری است.
مثال واقعی Minify
{
"orderId": 9812,
"customer": {
"name": "علی رضایی",
"city": "تهران"
},
"items": [
{ "sku": "A-10", "qty": 2 },
{ "sku": "B-20", "qty": 1 }
],
"paid": true
}
خروجی صحیح:
{"orderId":9812,"customer":{"name":"علی رضایی","city":"تهران"},"items":[{"sku":"A-10","qty":2},{"sku":"B-20","qty":1}],"paid":true}
فاصله داخل نام فارسی حفظ شده و نوع Number و Boolean تغییر نکرده است.
روش اشتباه: حذف فاصله با Regex
یک اشتباه رایج این است که همه whitespaceها با Regex حذف شوند:
const broken = input.replace(/\s+/g, "");
این روش داده داخل String را هم تغییر میدهد. برای مثال "hello world" به "helloworld" تبدیل میشود. همچنین Escapeها و حالتهای پیچیده String میتوانند Regex ساده را گمراه کنند. راه امن Parse و Serialize است.
Minify در JavaScript
function minifyJson(input) {
const data = JSON.parse(input);
return JSON.stringify(data);
}
try {
const output = minifyJson(source);
console.log(output);
} catch (error) {
console.error("Invalid JSON:", error.message);
}
JSON.stringify بدون آرگومان فاصله، خروجی فشرده تولید میکند. این روش ساختار را Parse میکند و JSON نامعتبر را بهجای تولید خروجی خراب گزارش میدهد.
تأثیر undefined و مقدارهای غیر JSON
اگر ورودی از Object جاوااسکریپت ساخته شده باشد، باید تفاوت آن با متن JSON را در نظر گرفت. مقدار undefined، Function، Symbol و BigInt رفتار ویژه دارند و بخشی از مدل داده JSON نیستند. مقاله تفاوت JSON و JavaScript Object این موضوع را کاملتر بررسی میکند. برای Minify متن JSON معتبر، ابتدا همیشه متن را Parse کنید.
Minify در Python
import json
def minify_json(source: str) -> str:
data = json.loads(source)
return json.dumps(
data,
ensure_ascii=False,
separators=(",", ":")
)
try:
output = minify_json(source)
except json.JSONDecodeError as exc:
print(f"Invalid JSON at line {exc.lineno}, column {exc.colno}")
گزینه separators فاصله بعد از کاما و دونقطه را حذف میکند. ensure_ascii=False باعث میشود نویسههای فارسی بهصورت خوانا باقی بمانند، هرچند هر دو نمایش از نظر دادهای معتبر هستند.
Minify در C#
using System.Text.Json;
static string MinifyJson(string source)
{
using JsonDocument document = JsonDocument.Parse(source);
return JsonSerializer.Serialize(document.RootElement);
}
برای کنترل بیشتر میتوان JsonSerializerOptions را تنظیم کرد. گزینه WriteIndented = false حالت فشرده را حفظ میکند. خطای Parse باید به کاربر با موقعیت مناسب گزارش شود.
آیا Minify ترتیب کلیدها را تغییر میدهد؟
هدف Minify تغییر ترتیب کلیدها نیست. با این حال Parser و Serializer ممکن است بسته به زبان یا ساختار داخلی، ترتیب را متفاوت بازنویسی کنند. اگر ترتیب پایدار برای Diff، Hash یا Snapshot مهم است، باید از قاعده جداگانه مرتبسازی کلیدهای JSON یا Canonicalization استفاده کنید.
Minify و عددها
Parser ممکن است نمایش متنی عدد را نرمال کند. برای مثال یک Serializer میتواند 1.0 را به 1 تبدیل کند، در حالی که مقدار عددی مشابه است. برای دادههای مالی یا شناسههای بزرگ باید محدودیت Number در Runtime را بررسی کنید. در JavaScript اعداد صحیح بسیار بزرگ ممکن است دقت خود را از دست بدهند؛ در این حالت نگهداری شناسه بهصورت String یا استفاده از Parser تخصصی لازم است.
Minify و Escape نویسهها
Serializer ممکن است بعضی کاراکترها را Escape کند یا Escapeهای ورودی را به نمایش دیگری تبدیل کند. a و a از نظر مقدار String برابرند، اما متن بایتبهبایت یکسان نیست. اگر خروجی برای امضا، Hash یا مقایسه دقیق متنی استفاده میشود، فقط Minify کافی نیست و باید قرارداد Canonical مشخص باشد.
JSON نامعتبر را Minify نکنید
Minifier نباید ورودی نامعتبر را با حذف تصادفی کاراکترها «اصلاح» کند. کامای اضافه، کوتیشن تکی، Comment، کلید بدون کوتیشن و مقدارهای NaN یا Infinity در JSON استاندارد معتبر نیستند. ابتدا خطا را با موقعیت دقیق نمایش دهید و کاربر را به راهنمای خطاهای JSON یا ابزار Validator هدایت کنید.
Minify در APIها
بیشتر Serializerهای API در محیط Production بهصورت پیشفرض خروجی بدون تورفتگی تولید میکنند. فعالکردن Pretty Print برای همه پاسخها معمولاً حجم را افزایش میدهد. با این حال Minify بهتنهایی جایگزین Compression، Cache و طراحی درست Payload نیست.
- فقط فیلدهای موردنیاز را ارسال کنید.
- Compression انتقال را فعال کنید.
- Pagination را برای فهرستهای بزرگ بهکار ببرید.
- برای کلاینتهای Debug امکان Pretty Print جداگانه داشته باشید.
Minify برای ذخیرهسازی
ذخیره JSON فشرده میتواند فضای فایل را کاهش دهد، اما در بسیاری از سیستمها هزینه خوانایی و Review را بالا میبرد. برای فایلهای Config که انسان ویرایش میکند، نسخه Pretty مناسبتر است. برای Cache، Export ماشینی و Payload تولیدشده، نسخه Minified منطقیتر است. اگر سیستم فایل یا پایگاه داده Compression داخلی دارد، سود Minify ممکن است کمتر شود.
عملکرد و حافظه
روش Parse و Serialize معمولاً کل سند را در حافظه نگه میدارد. برای JSONهای بسیار بزرگ این کار میتواند مصرف حافظه را بالا ببرد. پردازش Streaming امکانپذیر است، اما باید Stringها و Escapeها بهدرستی تشخیص داده شوند. برای ابزار آنلاین، محدودیت اندازه و عمق ساختار لازم است تا ورودی مخرب باعث مصرف بیش از حد CPU یا حافظه نشود.
امنیت و حریم خصوصی
Minify هیچ دادهای را مخفی، رمزنگاری یا ناشناس نمیکند. Token، Password، ایمیل و اطلاعات شخصی پس از Minify همچنان در خروجی وجود دارند. کاربر نباید JSON محرمانه را در ابزار نامطمئن وارد کند. پردازش محلی در مرورگر و سیاست روشن نگهداری داده مزیت مهمی است.
- از
evalبرای Parse کردن JSON استفاده نکنید. - محدودیت حجم و عمق تعیین کنید.
- Secretها را پیش از اشتراکگذاری حذف کنید.
- خروجی Minified را امنتر از ورودی تلقی نکنید.
- برای داده امضاشده از Canonicalization قراردادمحور استفاده کنید.
خطاهای رایج
حذف whitespace داخل String
این خطا معمولاً نتیجه Regex است و مقدار واقعی را تغییر میدهد.
تبدیل نوع داده
Number، Boolean و null نباید به String تبدیل شوند. خروجی باید پس از Parse از نظر ساختاری با ورودی برابر باشد.
یکی دانستن Minify با gzip
Minify فقط متن را جمعوجور میکند. برای کاهش جدی حجم شبکه، Compression انتقال همچنان لازم است.
اعتماد به Minify برای Validation
موفق بودن Minify فقط نشان میدهد Parser توانسته متن را بخواند؛ درباره Schema، فیلدهای Required یا منطق داده تضمینی نمیدهد.
استفاده برای پنهانکردن اطلاعات
یک خطی شدن JSON مانع خواندن آن نمیشود و ابزارهای Formatter فوراً آن را خوانا میکنند.
بهترین روشها
- ورودی را با Parser استاندارد بخوانید.
- در صورت خطا، شماره خط و ستون را گزارش کنید.
- Whitespace داخل String را دستنخورده نگه دارید.
- نوع مقدارها و ترتیب Array را حفظ کنید.
- برای Unicode و اعداد بزرگ رفتار Runtime را بررسی کنید.
- حجم را برحسب بایت UTF-8 اندازه بگیرید.
- در شبکه Minify را همراه Compression استفاده کنید.
- برای Hash و امضا به Canonicalization کامل تکیه کنید.
چکلیست ابزار JSON Minifier
- آیا JSON نامعتبر را با پیام دقیق رد میکند؟
- آیا متن فارسی و Unicode را سالم نگه میدارد؟
- آیا فاصله داخل String حفظ میشود؟
- آیا Number، Boolean و null تغییر نمیکنند؟
- آیا حجم قبل و بعد را نشان میدهد؟
- آیا امکان بازگرداندن خروجی به حالت Pretty وجود دارد؟
- آیا پردازش داده محرمانه محلی انجام میشود؟
- آیا محدودیت فایل بزرگ مشخص است؟
جمعبندی
JSON Minify روشی برای حذف فاصلهها، تورفتگی و خطهای غیرضروری از نمایش متنی JSON است. این کار میتواند حجم Payload را کاهش دهد و برای API، Cache و فایلهای ماشینی مفید باشد، اما مقدار داده، نوعها و ترتیب Array نباید تغییر کند. Minify با Compression، Validation، Encryption و Canonicalization متفاوت است. روش امن، Parse کردن JSON معتبر و Serialize کردن آن بدون تورفتگی است؛ نه حذف فاصله با Regex. برای فشردهسازی سریع و بررسی میزان کاهش حجم میتوانید از ابزار JSON Minifier استفاده کنید و در صورت نیاز خروجی را دوباره با Formatter خوانا کنید.