Как быстро исправить повреждённые JSON-файлы: полевое руководство разработчика

A visual metaphor of repairing broken digital data structures

Ваш вызов API только что упал с ошибкой JSONDecodeError: Expecting property name enclosed in double quotes. Время идёт. Данные пришли от LLM, и где-то в этом ответе на 2000 токенов одна-единственная висячая запятая убила весь ваш конвейер.

По состоянию на май 2026 года самый быстрый способ исправить повреждённые JSON-файлы — использовать автоматизированные библиотеки вроде json_repair (Python) или jsonrepair (npm). Эти инструменты созданы специально для мгновенного исправления синтаксических ошибок, порождаемых LLM. При ручном исправлении обычные подозреваемые — это висячие запятые, одинарные кавычки или ключи без кавычек — три самых частых нарушения стандарта RFC 8259.

Самое быстрое решение: json_repair для выводов LLM

Стандартные парсеры, такие как json.loads() в Python, строгие по замыслу. Один символ не на своём месте вызывает JSONDecodeError, и всё останавливается. В 2026 году это повседневная проблема, потому что LLM регулярно оборачивают JSON в разговорный текст, обрывают ответы на полуслове или раскидывают комментарии, нарушающие спецификацию.

Библиотека json_repair — это решение по умолчанию. Согласно GitHub, по состоянию на 2026 год проект набрал более 4700 звёзд. Он работает, «угадывая» намерение строки: закрывает недостающие скобки, расставляет кавычки и удаляет лишний текст вокруг блока JSON.

Простой трёхэтапный процесс json_repair: ввод (повреждено) -> угадывание намерения -> вывод (корректно)

Python: до и после

Установка: pip install json-repair

Повреждённый ввод:

import json_repair

bad_json = '{"user": "Alice", "status": tru'
decoded_object = json_repair.loads(bad_json)

Что произошло за кулисами: json_repair понял, что tru, скорее всего, было true, добавил недостающую закрывающую скобку и вернул корректный словарь Python. Никакого ручного вмешательства.

Режим Salvage: когда данные совсем плохи

Для более сложных случаев в json_repair (v0.59.5+) есть режим Salvage. Как указано в документации проекта, этот режим создан специально для обрезанных ответов ИИ или повреждённых логов. Он может принудительно превращать массивы в объекты или отбрасывать элементы, которые уже не спасти, гарантируя, что вывод соответствует вашей схеме.

import json_repair

# Salvage mode for severely truncated data
result = json_repair.loads(
    '{"items": [{"id": 1, "name": "Widget"}, {"id": 2, "na',
    salvage_mode=True
)
# Result: {'items': [{'id': 1, 'name': 'Widget'}, {'id': 2}]}
# Dropped the incomplete 'na' but saved everything else

Альтернатива для npm

В проектах на Node.js ту же задачу решает CLI-утилита jsonrepair:

# Fix a file in place
npx jsonrepair broken.json > fixed.json

# Fix a string in a script
const { jsonrepair } = require('jsonrepair');
const fixed = jsonrepair('{"name": "test",}');

Ручная отладка: находим, что нарушило спецификацию

Когда автоматизация не справляется, нужно точно найти, в каком месте файл нарушает RFC 8259. JSON гораздо менее снисходителен, чем YAML или JavaScript. Как объясняет команда диагностики JSONParser: «Парсер падает на первом символе, который не может осмыслить, и это часто лишь downstream-симптом проблемы, возникшей несколькими строками выше».

Три главных убийцы JSON

Убийца 1: висячие запятые

По данным DEV Community, висячие запятые — причина №1 сбоев парсинга. В JavaScript они допустимы, но запрещены после последнего элемента в массиве или объекте JSON.

// BROKEN - trailing comma after "active"
{
  "name": "Alice",
  "status": "active",
}

// FIXED - no comma before closing brace
{
  "name": "Alice",
  "status": "active"
}

Убийца 2: одинарные кавычки

JSON требует двойных кавычек (") как для ключей, так и для строковых значений. Многие Python- и JavaScript-разработчики случайно используют одинарные кавычки ('). Как отмечает TidyCode, это обязательное исправление.

// BROKEN - single quotes
{'name': 'Alice'}

// FIXED - double quotes
{"name": "Alice"}

Убийца 3: ключи без кавычек

В JavaScript можно написать { name: "Alice" }. В JSON каждый ключ требует двойных кавычек.

// BROKEN - unquoted key
{name: "Alice"}

// FIXED - quoted key
{"name": "Alice"}

Сравнение синтаксиса некорректного и корректного JSON бок о бок

Ошибка «Unexpected Token»

Когда валидатор выдаёт «Unexpected Token», это значит, что парсер наткнулся на NaN, Infinity или undefined — константы JavaScript, которые JSON не поддерживает. JSON допускает только null, true, false и числа.

// BROKEN - NaN is not valid JSON
{"score": NaN, "result": Infinity}

// FIXED - replace with null or valid values
{"score": null, "result": null}

Строгий парсинг против парсинга с восстановлением: когда что использовать

Правильный подход зависит от того, откуда поступают ваши данные. Файлы конфигурации, редактируемые человеком, заслуживают строгого парсинга, чтобы заставить автора исправлять ошибки. Машинные данные от LLM или логов API нуждаются в парсинге с восстановлением.

Возможность Строгий (json.loads) Восстановление (json_repair)
Висячие запятые Возбуждает JSONDecodeError Автоматически удаляются
Одинарные кавычки Сбой Преобразуются в двойные
Усечённые данные Сбой Закрывает открытые скобки/кавычки
Комментарии Сбой Автоматически удаляются
Лучший сценарий Конфиги, редактируемые человеком Вывод LLM, логи API

Восстановление по схеме с Pydantic

Процессом восстановления можно управлять с помощью Pydantic v2 или JSON Schema. Передав json_repair схему, инструмент делает больше, чем просто исправляет синтаксис: он может корректировать типы (превращая строку "1" в число 1) и заполнять недостающие обязательные поля значениями по умолчанию.

from pydantic import BaseModel
import json_repair

class User(BaseModel):
    id: int
    name: str
    active: bool = True

# Broken JSON with wrong types
raw = '{"id": "42", "name": "Alice"}'
repaired = json_repair.loads(raw)

# Validate against schema
user = User(**repaired)
# user.id is now int(42), user.active defaults to True

Как отметил Stefano Baccianella в описании проекта 2025 года, этот подход оптимизирован под «в основном корректный, но технически недействительный» JSON, который обычно порождают языковые модели.

Обработка мультигигабайтных файлов без падений

Восстановить фрагмент в 10 КБ легко. Починить файл в 2 ГБ требует стратегии, которая не сожрёт всю вашу оперативную память. Загрузка всего файла в память вызывает ошибки нехватки памяти (OOM).

Стратегия 1: потоковая обработка с ijson

Для огромных наборов данных используйте ijson, обрабатывая данные по частям. Как упоминает Scrapfly, ijson обрабатывает данные инкрементально. Сочетайте его со скриптом очистки, который исправляет проблемы построчно ещё до парсинга.

import ijson

# Stream through a large JSON file
with open('huge_broken.json', 'r') as f:
    for item in ijson.items(f, 'records.item'):
        # Process each item individually
        process(item)

Стратегия 2: CLI-конвейер для максимальной эффективности

Самый экономный по памяти подход для больших файлов — использовать CLI jsonrepair и направлять вывод напрямую в новый файл:

# Streams repair, never loads full file into memory
jsonrepair large_broken.json > fixed.json

Это значительно экономнее по памяти, чем загрузка файла в Python или браузер.

Заключение

Исправление повреждённого JSON больше не ручная рутина благодаря учитывающим AI библиотекам вроде json_repair. Вам по-прежнему нужно знать основы RFC 8259 — никаких висячих запятых, никаких одинарных кавычек, никаких ключей без кавычек — но в 2026 году при работе с данными в масштабе автоматизация остаётся единственным практически применимым подходом.

Рабочий процесс прост: сначала попробуйте библиотеку восстановления. Если не получилось — используйте валидатор, чтобы точно указать синтаксическую ошибку. Так ваши приложения продолжат работать, даже когда входящие данные далеки от идеала.

Часто задаваемые вопросы

Официально ли JSON поддерживает комментарии или одинарные кавычки?

Нет. Стандарт RFC 8259 строго запрещает комментарии. Одинарные кавычки также недействительны — для ключей и строк допускаются только двойные кавычки. Однако такие инструменты, как json_repair, могут автоматически удалять комментарии и преобразовывать кавычки, делая файлы доступными для разбора стандартными библиотеками.

Как обрабатывать очень большие повреждённые JSON-файлы без падений?

Используйте потоковый парсер вроде ijson, чтобы обрабатывать данные порциями. Избегайте загрузки всей повреждённой строки в одну переменную. Для максимальной скорости применяйте CLI-инструменты восстановления, которые направляют вывод напрямую в новый файл на диске, не удерживая всё в памяти.

В чём разница между повреждённым (malformed) и недействительным (invalid) JSON?

Повреждённый JSON нарушает синтаксические правила — не хватает скобок, ключи без кавычек, висячие запятые — из-за чего его невозможно разобрать. Недействительный JSON соблюдает все синтаксические правила, но не соответствует конкретной JSON Schema (например, поле является строкой, тогда как схема ожидает целое число). Исправление повреждённого JSON — это структурное восстановление; исправление недействительного JSON — вопрос целостности данных.

Можно ли использовать json_repair вместе с валидацией Pydantic?

Да. Сначала выполните json_repair.loads(), чтобы исправить синтаксические ошибки, затем передайте восстановленный словарь в вашу модель Pydantic для проверки типов и соблюдения схемы. Этот двухэтапный подход решает как структурные, так и семантические проблемы.

Что насчёт JSON с комментариями в стиле JavaScript?

Стандартный JSON не поддерживает комментарии, но json_repair может автоматически удалять комментарии // и /* */. Если вам нужны комментарии в конфигурационных файлах, рассмотрите формат JSONC (JSON с комментариями) и совместимый парсер, например json5 для Python.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *