JSON — распространённый формат обмена данными. Синтаксис строгий: лишняя запятая, неэкранированная кавычка или неверный тип могут сломать парсинг. В этой статье рассмотрены типичные ошибки JSON и способы их поиска и исправления.
Синтаксис JSON
JSON поддерживает: строки (в двойных кавычках), числа, true, false, null, массивы [], объекты {}. Ключи объектов — только строки в двойных кавычках.
Типичные ошибки
Лишняя запятая (trailing comma)
{
"name": "Test",
"items": [1, 2, 3,]
}
Запятая после последнего элемента недопустима в JSON. В JavaScript (ES5+) trailing comma разрешён, в JSON — нет.
Исправление: удалить запятую после 3.
Одинарные кавычки
{
'name': 'Test'
}
JSON допускает только двойные кавычки для строк и ключей.
Исправление: заменить ' на ".
Неэкранированные символы в строках
{
"path": "C:\Users\file.txt",
"quote": "He said "hello""
}
Обратный слеш \ и кавычка " внутри строки должны быть экранированы: \\, \".
Исправление:
{
"path": "C:\\Users\\file.txt",
"quote": "He said \"hello\""
}
Неверный тип числа
{
"value": 01,
"nan": NaN,
"inf": Infinity
}
JSON не поддерживает ведущие нули (кроме 0), NaN, Infinity, -Infinity.
Исправление: использовать допустимые числа или строки.
Комментарии
{
// комментарий
"name": "Test"
}
JSON не поддерживает комментарии.
Исправление: удалить комментарии. Для конфигов с комментариями рассмотрите JSONC или YAML.
Неверная кодировка
JSON должен быть в UTF-8. BOM в начале файла может вызвать ошибки в некоторых парсерах.
Исправление: сохранять файл в UTF-8 без BOM.
Поиск ошибки по сообщению парсера
Типичные сообщения:
| Сообщение | Причина |
|---|---|
Unexpected token | Лишний символ, неверная запятая, неэкранированная кавычка |
Unexpected end of JSON input | Обрезанный JSON, незакрытая скобка |
Expected property name | Ошибка в ключе объекта (кавычки, запятые) |
Unexpected number | Неверный формат числа |
Парсер обычно указывает позицию (символ или строка). Используйте её как отправную точку.
Инструменты валидации
JSON Formatter на rechecker.ru позволяет вставить JSON, проверить его на ошибки и получить форматированную версию. При наличии ошибок показывается сообщение и приблизительная позиция.
Программная валидация
JavaScript
try {
const data = JSON.parse(jsonString);
} catch (e) {
console.error('JSON error:', e.message);
console.error('Position:', e.message.match(/position (\d+)/));
}
Python
import json
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f"Error at line {e.lineno}, column {e.colno}: {e.msg}")
Регулярные выражения для поиска
Для грубой проверки типичных ошибок:
- Trailing comma:
,\s*[}\]\] - Одинарные кавычки:
'[^']*' - Неэкранированные кавычки в строках сложнее — лучше использовать валидатор.
JSON из внешних источников
При получении JSON из API, файлов или пользовательского ввода всегда оборачивайте парсинг в try/catch. Проверяйте структуру данных после парсинга — валидный JSON может не соответствовать ожидаемой схеме.
Минификация и отладка
Минифицированный JSON сложнее отлаживать. Используйте форматтер для «разворачивания» структуры. JSON Formatter на rechecker.ru форматирует JSON с отступами и переносами строк.
Дополнительные материалы
Работа с JSON в API, парсинг и валидация — в Работа с JSON в API: парсинг, валидация, лучшие практики. Общее руководство по валидации и форматированию — в JSON валидация и форматирование.
Ошибки кодировки
JSON должен быть в UTF-8. Частые проблемы:
- BOM (Byte Order Mark) в начале файла — некоторые парсеры выдают ошибку. Сохраняйте файлы в UTF-8 без BOM
- Неверная кодировка при чтении — убедитесь, что файл или поток читаются как UTF-8
- Смешение кодировок — при конкатенации строк из разных источников проверяйте кодировку
Числа с ведущими нулями
01, 007 — невалидны в JSON. Допустимо только 0 и числа без ведущих нулей. Если нужна строка с нулями — используйте строковый тип: "007".
Специальные символы в строках
Обязательное экранирование: \", \\, \/, \b, \f, \n, \r, \t, \uXXXX. Контрольные символы (U+0000 – U+001F) должны быть экранированы как \uXXXX.
Вложенные структуры
При глубокой вложенности легко ошибиться со скобками. Проверяйте парность { и }, [ и ]. Редакторы с подсветкой скобок помогают находить незакрытые блоки.
JSON5 и JSONC
Расширения JSON5 и JSONC поддерживают комментарии, trailing commas, одинарные кавычки. Они не являются стандартным JSON. Если API или библиотека ожидает строгий JSON, не используйте эти расширения.
Отладка по позиции ошибки
Парсеры обычно возвращают номер символа или строки. Для подсчёта позиции:
const lines = jsonString.split('\n');
const position = 42; // из сообщения об ошибке
let count = 0;
for (let i = 0; i < lines.length; i++) {
count += lines[i].length + 1;
if (count >= position) {
console.log(`Line ${i + 1}, around: ${lines[i]}`);
break;
}
}
Валидация через JSON Schema
JSON Schema позволяет описать ожидаемую структуру и типы. Библиотеки (ajv, tv4) проверяют данные на соответствие схеме. Это полезно для API и конфигов:
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] };
const validate = ajv.compile(schema);
if (!validate(data)) console.log(validate.errors);
Обработка в редакторах
VS Code, WebStorm и другие IDE подсвечивают синтаксические ошибки JSON в реальном времени. Настройте линтеры (ESLint с json plugin) для автоматической проверки при сохранении.
Копирование из других форматов
При копировании из YAML, XML или таблиц часто возникают ошибки: неэкранированные кавычки, trailing commas, неверные типы. Всегда валидируйте результат через JSON Formatter после конвертации.