Форматирование и проверка JSON

Отформатировать JSON с отступами в 2 или 4 пробела, сжать в одну строку, найти ошибку с номером строки и позиции и отсортировать ключи. Показывает размер до и после. Всё считается в браузере.

Настройки

Форматирование расставляет отступы, сжатие убирает все пробелы между элементами

Сколько пробелов на каждый уровень вложенности

Сортировать ключи по алфавитуНа всех уровнях вложенности. Массивы не переставляются: их порядок — данные, а не оформление
Экранировать не-ASCIIЗаменяет символы вне ASCII на \uXXXX. Работает только в режиме сжатия

Исходный JSON

Разбор идёт по мере ввода — результат обновляется сразу

Результат

Зачем проверять и форматировать JSON

JSON читают машины, а правят его люди — и эти две задачи требуют разной записи. Программе важен только смысл: пробелы между элементами она игнорирует, порядок ключей в объекте ей безразличен. Человеку важнее вид: структуру, где каждый уровень сдвинут отступом, видно с одного взгляда, а строка в сотни килобайт не читается вовсе. Форматирование и сжатие — это перевод одного и того же JSON в ту запись, которая нужна сейчас.

Отдельная задача — понять, почему JSON не разбирается. Ответ вида «Unexpected token in JSON at position 8412» без указания места бесполезен: в сжатом файле на эту позицию нужно ещё как-то попасть. Инструмент показывает номер строки, позицию в строке и смещение от начала, приводит саму проблемную строку и указывает под ней место, где разбор остановился. Сообщение движка приводится дословно, потому что по нему ищут причину, а рядом даётся пояснение о том, что обычно за такой формулировкой стоит.

Всё происходит в браузере: разбор, запись и подсчёт размера выполняются на JavaScript в самой странице. JSON не отправляется на сервер, не сохраняется и не попадает в логи — это важно, когда в файле есть выгрузка с персональными данными, конфигурация с ключами доступа или выгрузка из внутренней системы. Инструментом можно пользоваться офлайн, а размер результата до и после виден до того, как файл уйдёт по назначению.

Частые вопросы

Как найти ошибку в JSON и что означает номер позиции?

Вставьте JSON в поле «Исходный JSON» — разбор идёт по мере ввода. При ошибке показывается сообщение движка (то самое, которое вы увидите в консоли браузера), номер строки, позиция в строке и смещение — сколько символов стоит перед местом ошибки. Строка и позиция считаются с единицы и по символам, а не по байтам, поэтому в тексте с эмодзи или кириллицей они остаются верными. Ниже приводится сама проблемная строка и знак «^» под нужным местом. Учтите: парсеры останавливаются на символе, который прочитали уже после настоящей ошибки, — висячая запятая в конце строки почти всегда находится строкой выше.

Чем минификация отличается от форматирования?

Только записью. Форматирование расставляет переводы строк и отступы, чтобы структуру было видно глазами; минификация убирает все пробелы между элементами, чтобы текст занимал минимум места. Значения при этом не меняются: числа не округляются, строки не перекодируются, ни один ключ не теряется. Форматированный вид нужен человеку — для чтения, правки и сравнения, минифицированный — для передачи и хранения: он короче и быстрее разбирается. Переключайтесь между режимами сколько угодно: результат всегда собирается из одного и того же разобранного значения.

Зачем сортировать ключи по алфавиту?

По стандарту объект JSON — неупорядоченный набор пар, поэтому порядок ключей в нём не несёт смысла, но при сравнении двух файлов он превращается в шум: в diff выглядят изменёнными строки, у которых совпадают и ключ, и значение. Отсортированная запись делает одинаковые по смыслу объекты одинаковыми и на глаз, и для программы. Флажок сортирует ключи вложенных объектов на всех уровнях, массивы оставляя нетронутыми — их порядок как раз является данными. Числа в именах сравниваются как числа, поэтому item2 идёт раньше item10, а не наоборот.

Почему после минификации файл меньше и на сколько?

Убираются отступы и переводы строк. В объекте с отступом в два пробела это обычно 20–40% объёма, а на глубоко вложенной структуре экономия выше: каждый уровень отступа повторяется столько раз, сколько у него потомков. Точные цифры инструмент показывает после обработки — размер до и после и разницу в процентах, посчитанную по байтам UTF-8, то есть ровно по тому объёму, который займёт файл. Если исходник уже был сжат, экономии не будет, а форматирование наоборот увеличит текст. Отдельный случай — флажок «Экранировать не-ASCII»: он делает файл больше, потому что каждая кириллическая буква превращается в шесть ASCII-символов вида \u0451.

Можно ли отформатировать JSON с комментариями?

Нет, и это ограничение самого JSON, а не инструмента: комментариев в стандарте нет, поэтому любой строгий разбор — в том числе JSON.parse, которым пользуется браузер, — на них останавливается с ошибкой. Расширения JSON5 и JSONC (в нём хранятся, например, настройки VS Code) комментарии допускают, но это уже не JSON, и обычная программа такой файл не примет. Что делать: снять комментарии в редакторе, который их подсвечивает, а пояснения хранить рядом с файлом, а не внутри него. Молча вырезать комментарии инструмент не станет: из «сломанного» файла получился бы другой, и было бы непонятно, что именно изменилось.

Зачем экранировать не-ASCII?

Флажок заменяет все символы вне ASCII на последовательности вида \uXXXX: «ёж» превращается в \u0451\u0436. Значение при этом не меняется — это тот же символ, записанный по-другому, и обратный разбор даёт исходный текст. Нужно это там, где получатель не понимает UTF-8: старые системы, выгрузки для инструментов, читающих только ASCII, файлы, которые должны пережить пересохранение в однобайтовой кодировке. Вторая причина — предсказуемый размер: после экранирования один символ занимает ровно один байт. Работает флажок только в режиме сжатия: в форматированном виде читаемость важнее экономии.

Есть ли ограничение на размер JSON?

Жёсткого предела инструмент не задаёт: текст обрабатывается целиком и никуда не отправляется, поэтому ограничивает только память устройства. Разбор идёт после каждого изменения текста, и на файлах в несколько мегабайт ввод начинает заметно тормозить — это чувствуется раньше, чем заканчивается память. На десятках мегабайт браузер может показать ошибку или подвиснуть: для таких файлов удобнее редактор или консольная утилита. Поле принимает текст любого размера, ничего не обрезая: если страница справляется, инструмент отработает полностью.