>_toolkitbox

~/tools / LLM JSON Repair

LLM JSON Repair — Исправляет сломанный JSON из ответа ИИ-модели

Исправьте «почти JSON», который возвращают ИИ-модели: инструмент убирает блоки кода и пояснения, лишние запятые и комментарии, чинит кавычки, ключи и значения из Python и показывает, что именно изменил. Ничего не покидает ваш браузер.

Отступ

Применяются только исправления с одним очевидным решением. Всё остальное сообщается с указанием позиции, а не угадывается.

Всё выполняется в вашем браузере. Вставленный текст никуда не загружается.

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

Когда пригодится

  • Исправить ответ модели перед тем, как передать его в JSON.parse или записать в конфигурационный файл
  • Очистить ответ, в котором вокруг JSON стоят блок кода и пояснение
  • Проверить, что изменилось, чтобы исправленное значение не попало в продакшен незамеченным

Как пользоваться

  1. Вставьте ответ модели или загрузите пример.
  2. Прочитайте исправленный JSON и список изменений под ним.
  3. Скопируйте результат. Изменения, отмеченные янтарным цветом, могут привести к потере информации, поэтому проверьте их.

Что считается корректным JSON

  • Строки и имена членов используют только двойные кавычки. Одинарные кавычки не входят в грамматику.
  • Комментариев нет. Единственный допустимый заполнитель — пробельные символы.
  • Запятая ставится только между членами или элементами, поэтому лишняя запятая в конце недопустима.
  • Значение — это объект, массив, число или строка либо одно из false, null и true. Infinity, NaN и undefined не являются значениями JSON.
  • У чисел не может быть ведущего нуля или ведущего +, а десятичная точка требует цифр с обеих сторон, поэтому 012, +5, .5 и 5. недопустимы.
  • Управляющие символы U+0000–U+001F внутри строки должны быть экранированы, поэтому необработанный перевод строки в строке недопустим.
  • На верхнем уровне может стоять любое значение, а не только объект или массив.

Как обычно ломается вывод модели

ПроблемаПримерЧто делает инструмент
Блок кода и болтовняSure! ```json { … } ``` Hope this helpsБерёт только JSON
Лишняя запятая в конце[1, 2,]Убирает запятую
Комментарий{"a": 1 // note}Убирает комментарий
Одинарные кавычки{'a': 'b'}Использует двойные кавычки
Ключ без кавычек{a: 1}Заключает ключ в кавычки
Значения из Python{"ok": True, "x": None}Записывает true и null
Необработанный перевод строки в строке"line one⏎line two"Экранирует его как \n
NaN или undefined{"x": NaN}Записывает null и предупреждает, что значение потеряно
Оборванный ответ{"items": [{"id": 1}, {"id":Закрывает всё незакрытое и предупреждает, что данные могут отсутствовать

Что можно исправлять безопасно, а что нет

Исправление безопасно, когда у сломанного текста есть только одно разумное прочтение. Лишнюю запятую, комментарий или блок кода можно убрать, не меняя того, что говорят данные. Другие изменения меняют смысл, поэтому они помечаются, и их нужно проверять: закрытие оборванного ответа даёт корректный JSON, в котором не хватает данных, а превращение NaN в null выбрасывает исходное значение.

Два ограничения идут от самого JSON. RFC 8259 говорит, что имена внутри объекта должны быть уникальными, а поведение программ при повторах непредсказуемо; этот инструмент сохраняет последнее, как и JSON.parse. Тот же RFC говорит, что программы хорошо совместимы, если не ожидают большего диапазона или точности, чем у IEEE 754 double. Инструмент сохраняет числа так, как вы их записали, но программа, которая разбирает очень длинное целое в double, округляет его. Целые числа от -(2^53)+1 до (2^53)-1 точны.

Лучше: попросите API о структурированном выводе

Исправление — запасной вариант. API моделей могут ограничивать вывод схемой, и три производителя описывают это по-разному.

  • OpenAI: Structured Outputs заставляет модель порождать ответы, соответствующие вашей JSON Schema, тогда как режим JSON гарантирует лишь корректный JSON. Отказ может не следовать схеме, а ответ, достигший максимального лимита токенов, неполон (статус incomplete, причина max_output_tokens).
  • Anthropic: структурированный вывод использует ограниченное декодирование, чтобы ответ следовал вашей схеме, и в документации сказано, что в большинстве случаев это выполняется. Отказ (stop_reason refusal) или ответ, оборванный по max_tokens, может не соответствовать схеме, поэтому проверяйте stop_reason перед разбором.
  • Google Gemini: модель настроена порождать JSON, соответствующий заданной вами схеме. Семантическая корректность не гарантируется, поэтому проверяйте значения, а некоторые ограничения, такие как minLength и maxLength, не применяются.

Ни один из трёх документов не обещает корректный JSON, если вывод оборван. Проверьте, почему модель остановилась, прежде чем доверять разобранному результату.

Источники (проверено 2026-10-23): RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format / OpenAI: Structured Outputs / Anthropic: Structured outputs / Google AI for Developers: Structured output

Вопросы

Что он исправляет?

Убирает блок кода и текст вокруг JSON; убирает лишние запятые в конце и комментарии // или /* */; заменяет одинарные и «умные» кавычки на двойные; заключает в кавычки ключи без кавычек; превращает True, False и None в true, false и null; добавляет пропущенные запятые между строками; экранирует необработанные переводы строки внутри строк; переписывает числа вида +5, .5 и 0x1F в допустимые числа JSON.

Что он никогда не меняет?

Значения. Строки сохраняются символ в символ, а у чисел остаются все цифры, поэтому длинный идентификатор вроде 12345678901234567890 не округляется. Повторяющиеся ключи обрабатываются как в JSON.parse: побеждает последний.

Что, если ответ оборвался?

Инструмент закрывает открытые строки, массивы и объекты и удаляет ключ, у которого ещё нет значения. Текст становится корректным, но не полным, поэтому результат помечается как возможно неполный. Лучше попросите модель продолжить или увеличьте лимит вывода, чем полагаться на обрезанный результат.

Почему NaN или undefined превратились в null?

В JSON нет NaN, Infinity и undefined. Инструмент записывает на их месте null и отмечает это, потому что исходное значение теряется.

Почему он отказывается от некоторого ввода?

Когда единственного очевидного исправления нет, например если многоточие (...) стоит вместо пропущенных элементов или на месте значения стоит просто слово, он останавливается и показывает место, а не гадает.

Текст отправляется на сервер?

Нет. Исправление выполняется в вашем браузере.

Похожие