Починка JSON

Починить JSON: убираются комментарии и висячие запятые, кавычки правятся, переносы строк экранируются. Список всех исправлений и проверка результата.

Всё работает в вашем браузере — данные не отправляются на сервер.

Когда нужно починить JSON

Битый JSON появляется по предсказуемым причинам, и почти всегда это не ошибка программиста, а следствие ручной правки. Файл правили руками в редакторе, скопировали кусок из документации, вырезали из лога, выгрузили из инструмента, который пишет почти-JSON. Потом вставили в конфигурацию, и в ответ прилетело сообщение об ошибке разбора. Починить json в таком случае — значит сделать работу, которую и так делает человек: убрать комментарии, поправить кавычки, снять запятую, которую забыли стереть, и закрыть скобку, которая не закрылась. Разница в том, что человек делает это вручную и не всегда понимает, что именно он изменил, а здесь каждое исправление видно отдельной строкой: было и стало.

Что умеет починка

  • Убираются комментарии в стиле // и блоки /* */, не задевая содержимое строк
  • Одинарные кавычки заменяются на двойные с сохранением экранирования
  • Удаляются висячие запятые перед закрывающей скобкой и квадратной скобкой
  • Управляющие символы и переводы строк внутри строк экранируются
  • Ключи, записанные без кавычек, получают кавычки
  • Незакрытые скобки и кавычки закрываются, а результат проверяется через JSON.parse

Как починить файл

  1. Вставьте содержимое файла в поле ввода
  2. Нажмите «Починить» — исправления пойдут в фиксированном порядке
  3. Посмотрите список изменений: там видно, что было и что стало
  4. Скопируйте результат, если проверка JSON.parse прошла
  5. Если не прошла, посмотрите указанную позицию и поправьте файл вручную

Как устроена починка

Разбор битого текста идёт в шесть проходов, и порядок проходов важен. Сначала удаляются комментарии: пока они на месте, двоеточие или фигурная скобка внутри комментария выглядят как структура. Затем одинарные кавычки переводятся в двойные, причём содержимое строки сохраняется, а экранированные символы пересчитываются. Третий проход снимает висячие запятые: сканирование идёт посимвольно, строки отслеживаются отдельно, и запятая удаляется только тогда, когда следом за ней, пропустив пробелы, идёт закрывающая скобка. Четвёртый проход экранирует переводы строк и другие управляющие символы внутри строк. Пятый одевает в кавычки ключи, записанные без них. Шестой закрывает незакрытые строки и скобки. В конце результат один раз проверяется через JSON.parse, и только после этого он считается готовым.

Что происходит с типичными поломками

БылоЧто сделаноСтало
{ "a": 1, }убрана висячая запятая перед закрывающей скобкой{ "a": 1 }
{ 'name': 'Alice' }одинарные кавычки заменены на двойные{ "name": "Alice" }
{ // заметка "a": 1 }удалён комментарий{ "a": 1 }
{ /* блок */ "a": 1 }удалён блок комментария{ "a": 1 }
{name: "Alice"}ключ одет в кавычки{"name": "Alice"}
{"a": 1, "b": [1, 2"закрыты квадратная и фигурная скобки{"a": 1, "b": [1, 2]}
{"text": "строка вторая"}перевод строки внутри строки экранирован{"text": "строка\nвторая"}
{"url": "http://x/a//b"}двойной слеш внутри строки оставлен как есть{"url": "http://x/a//b"}
{"a": 1 "b": 2}нечего чинить, показана позиция ошибкиразбор останавливается на позиции 8
[1, 2, 3,]убрана запятая в конце массива[1, 2, 3]
{'a': 'it\'s'}экранированная кавычка сохранена{"a": "it's"}
{"note": "/* не комментарий */"}содержимое строки не тронуто{"note": "/* не комментарий */"}

Каждая строка показывает, что именно изменилось. Ошибки на местах починки не исправляются, а показываются.

Откуда берётся битый JSON

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

Четвёртый источник — объединение файлов. Два куска склеили, и на стыке осталась запятая без пары или не хватило запятой между объектами. Пятый — редактор, который сохранил файл с переносом строки внутри значения, например при переносе длинного текста. Шестой — вырезанный из лога фрагмент: его скопировали из сообщения об ошибке, и структура оказалась неполной. Практически во всех случаях починка справляется, а вот когда файл обрезан посередине значения, она честно скажет, что разбор останавливается, и покажет позицию.

  • Ручная правка конфигурации в редакторе без подсветки
  • Копирование примера из документации, где есть комментарии
  • Выгрузка из инструмента, пишущего почти-JSON
  • Склейка двух кусков файла на стыке
  • Перенос длинного текста с новой строки внутри значения
  • Фрагмент лога, вырезанный из сообщения об ошибке

Что JSON не прощает и почему

Строгий формат не терпит почти ничего лишнего. Комментарий в разных реализациях понимают по-разному, поэтому в стандарте его нет. Одинарные кавычки допустимы в некоторых языках, но не в JSON. Запятая перед закрывающей скобкой выглядит естественно, но означает «после этого элемента идёт ещё один», а элемента нет. Перевод строки внутри строки запрещён буквально: строка в JSON не может содержать неэкранированную управляющую последовательность. Ключ без кавычек — привычная запись в JavaScript и Python, но не в JSON.

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

  • Комментарии в JSON не предусмотрены стандартом
  • Только двойные кавычки, одинарные не считаются строкой
  • Запятая перед закрывающей скобкой означает отсутствующий элемент
  • Перевод строки внутри строки нужно экранировать
  • Ключ без кавычек допустим в других языках, но не в JSON
  • Разбор останавливается на первом нарушении, а не на последнем

Разбор примера по шагам

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

Третий проход идёт по всему тексту и смотрит, что стоит за запятой: если после запятой, пропустив пробелы, идёт закрывающая скобка, запятая лишняя и удаляется. Четвёртый проход закрывает незакрытую строку и добавляет недостающие скобки в обратном порядке. После этого результат один раз прогоняется через JSON.parse: если разбор прошёл, значит файл теперь читается любым стандартным парсером. Если нет, инструмент показывает сообщение разбора, позицию и фрагмент текста рядом с проблемным местом.

Что происходит на каждом проходе

ПроходДействиеРезультат
1Удаление комментариев// до конца строки и /* */ целиком
2Замена кавычекОдинарные на двойные, содержимое сохраняется
3Висячие запятыеЗапятая перед } или ] удаляется
4Управляющие символыПеревод строки и таб внутри строки экранируются
5Ключи без кавычекКлюч получает кавычки
6Незакрытые конструкцииСтрока и скобки закрываются
7ПроверкаJSON.parse на результате
8Список измененийЧто было и что стало по каждому правлению

Каждый проход работает с текстом целиком, но порядок между ними принципиален: сначала убирается то, что мешает увидеть структуру.

С чем починка работает рядом

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

Отдельный сюжет — выгрузки. Часто JSON приходит из внешнего источника, и задача не починить файл, а разобрать его содержимое: конвертер CSV в JSON показывает таблицу, конвертер JSON в CSV выгружает обратно, а генератор типов TypeScript превращает структуру в интерфейсы для кода. И ещё одно: минификатор приводит JSON к компактному виду, когда размер файла важен, например при отправке по сети.

  • Сначала починка, потом форматирование
  • Пока файл не читается, его вид не имеет значения
  • Проверка по схеме идёт после того, как файл разобран
  • Сравнение версий полезно после починки обеих
  • Выгрузки и таблицы требуют уже других инструментов
  • Компактный вид важен, когда файл уходит по сети

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

Какие ошибки JSON починить можно

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

Что значит ошибка синтаксиса JSON и как её найти

Ошибка синтаксиса JSON означает, что текст нарушает правила формата: лишняя запятая, непарная кавычка, пропущенное двоеточие, незакрытая скобка. Разбор останавливается на первом таком месте и сообщает позицию. Здесь важно понимать, что стандартный разбор JSON строгий: он не прощает ни комментариев, ни одинарных кавычек, ни висячих запятых, ни табов. Инструмент не меняет стандарт, а приводит текст к тому, что стандарт допускает, и проверяет результат тем же разбором, которым пользуется приложение. Если разбор всё ещё не проходит, в сообщении будет указана точная позиция и прилегающий кусок текста.

Почему JSON не допускает комментариев

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

Что будет с типами данных при починке

Типы не меняются, и в этом весь смысл операции. Строки остаются строками, числа числами, булевы значения булевыми. Починка не превращает "42" в 42 и не делает null из пустой строки: такие вещи она не делает принципиально. Единственное, что касается типа, — кавычки. Значение в одинарных кавычках становится строкой, как и должно быть по правилам JSON, а голое слово true остаётся булевым значением. Если в вашем исходном файле числа были записаны в кавычках, они такими и останутся, потому что исправление касается формы записи, а не смысла.

Безопасно ли отдавать такой файл в продакшен

Сначала посмотрите список исправлений, а не только итоговый текст. Починка меняет форму записи, и почти всегда это то, что нужно, но почти всегда это и заметная правка. Если в файле были комментарии, они исчезнут, и при следующем редактировании их уже не будет. Если значения стояли в одинарных кавычках, кавычки сменятся, и если где-то в коде идёт сравнение по сырой строке, это место стоит проверить. Практическое правило простое: починенный файл сначала проходит тесты, а потом едет в продакшен.

Что делать, если починить не удалось

Смотрите на позицию из сообщения об ошибке и на прилегающий фрагмент текста. Обычно это нехватка запятой между двумя значениями, лишняя запятая в неожиданном месте или перепутанные скобки. Такие места чинить автоматически опасно: нельзя отличить «забыли запятую» от «забыли значение». В этом случае правьте файл вручную, ориентируясь на указанную позицию, и прогоняйте починку снова — она уберёт всё остальное.

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

Форматирование занимается видом: расставляет отступы, переносит строки, выравнивает ключи. Починка занимается смыслом: делает так, чтобы текст вообще разбирался. Если файл уже читается, а нужно только привести его к красивому виду, хватит форматирования JSON. Если файл не читается, форматирование не поможет, и наоборот: сначала починка, потом форматирование. Кстати, починка умеет и то, чего не умеет форматирование: показать список изменений, а не только итоговый текст, и указать позицию, на которой разбор спотыкается.

Можно ли восстановить потерянные данные

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

Похожие инструменты