Минифицируйте JSON до наименьшей корректной формы или выводите его с отступами в 2 пробела, 4 пробела или табуляцию. Необязательная сортировка ключей, счётчик сэкономленных байтов, работает полностью в вашем браузере.
Уберите каждый байт, который не меняет данные. Вставьте JSON, чтобы удалить все необязательные пробелы, или переключитесь на форматирование, чтобы вывести его с нужным отступом. Сортировка ключей делает два документа сопоставимыми, а счётчик байтов показывает, что именно дала минификация.
–
Что делает и чего не делает минификация
Удаляются только пробелы
Грамматика JSON допускает пробелы, табуляцию и переносы строк между любыми двумя токенами, и ни один из них не несёт смысла. Минификация - это удаление каждого из этих необязательных символов: {"a": 1, "b": 2} превращается в {"a":1,"b":2}. Разобранное значение побайтово идентично в памяти, поэтому эту операцию всегда безопасно применять к данным перед отправкой.
Чего минификация не делает, так это не сжимает данные. Имена ключей, содержимое строк и точность чисел сохраняются точно. Если ваш документ велик потому, что повторяет одни и те же двадцать имён полей в десяти тысячах записей, минификация уберёт отступы, но оставит повторения нетронутыми - это задача для gzip или другой схемы.
Когда экономия действительно важна
В типичном ответе API в красивом формате пробелы составляют от 10% до 30% исходного размера. Это кажется выгодным, пока вы не вспомните, что почти каждый HTTP-ответ уже сжат gzip или brotli при передаче, а алгоритмы сжатия отлично обрабатывают серии пробелов. После gzip разница между минифицированным и форматированным JSON часто составляет менее 2%.
Минификация всё же находит своё место в трёх случаях: данные, встроенные напрямую в HTML-страницу или JavaScript-бандл, где они не сжимаются отдельно; хранение в столбце базы данных или кэше, где занимает место именно сырая строка; и везде, где вы считаете символы по жёсткому лимиту, например параметр URL или поле сообщения с фиксированным пределом.
Сортировка ключей для сравнения
Объекты JSON официально не упорядочены, но каждый сериализатор записывает ключи в каком-то конкретном порядке, и две системы редко выбирают один и тот же. Это делает обычное текстовое сравнение двух логически идентичных документов нечитаемым.
Сортировка ключей рекурсивно перед выводом придаёт обоим документам один канонический вид, поэтому построчное сравнение наконец показывает только реальные изменения. Это тот же приём, что лежит в основе воспроизводимых сборок и кэширования по содержимому. Учтите, что сортировка меняет байтовый вывод, поэтому отсортированный документ больше не идентичен тому, что произвела исходная система - используйте его для сравнения, а не для циклического восстановления подписей.
Часто задаваемые вопросы
Мои данные куда-либо загружаются?
Нет. Разбор и повторная сериализация происходят полностью в вашем браузере со встроенными функциями JSON, поэтому документ никогда не покидает страницу.
Изменяет ли минификация мои данные?
Нет. Удаляются только незначащие пробелы между токенами. Каждый ключ, строка, число и логическое значение сохраняются без изменений, а разобранное значение идентично.
Почему экономия меньше, чем я ожидал?
Счётчик измеряет сырые байты UTF-8. Если ваш JSON уже компактный или бóльшая часть его размера - это содержимое строк, а не отступы, удалять практически нечего.
Нужно ли минифицировать, если сервер уже использует gzip?
Обычно нет для сетевых данных - gzip очень эффективно сжимает серии пробелов, поэтому дополнительный выигрыш часто менее 2%. Это всё же помогает для встроенного или сохранённого JSON.
Что делает сортировка ключей?
Она переупорядочивает ключи каждого объекта по алфавиту, рекурсивно. Два логически идентичных документа затем дают идентичный текст, что делает обычное построчное сравнение пригодным.
Почему я получил ошибку разбора на вроде бы корректном JSON?
Строгая грамматика отвергает завершающие запятые, строки в одинарных кавычках, комментарии и ключи без кавычек. Это особенности литералов объектов JavaScript, а не JSON.