Распространённые ошибки JSON и их решения
Полный справочник по распространённым ошибкам JSON: причины, примеры и способы исправления. Научитесь отлаживать и исправлять JSON.
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# Распространённые ошибки JSON и их решения
JSON может показаться простым форматом, но даже опытные разработчики сталкиваются с ошибками парсинга и валидации. В этом подробном руководстве мы рассмотрим самые частые ошибки JSON и способы их исправления.
Синтаксические ошибки
1. Одинарные кавычки вместо двойных
❌ Ошибка:
{
'имя': 'Иван',
'возраст': 30
}
Сообщение об ошибке:
Unexpected token ' in JSON at position 2
✅ Решение:
{
"имя": "Иван",
"возраст": 30
}
Причина: JSON требует двойные кавычки для строк и ключей.
2. Запятая в конце
❌ Ошибка:
{
"имя": "Иван",
"возраст": 30,
}
Сообщение об ошибке:
Unexpected token } in JSON at position 35
✅ Решение:
{
"имя": "Иван",
"возраст": 30
}
Причина: Последний элемент не должен иметь запятую после него.
3. Отсутствующие запятые
❌ Ошибка:
{
"имя": "Иван"
"возраст": 30
}
Сообщение об ошибке:
Unexpected token " in JSON at position 16
✅ Решение:
{
"имя": "Иван",
"возраст": 30
}
Причина: Пары ключ-значение должны разделяться запятыми.
4. Незакрытые кавычки
❌ Ошибка:
{
"имя": "Иван,
"возраст": 30
}
Сообщение об ошибке:
Unterminated string in JSON at position 13
✅ Решение:
{
"имя": "Иван",
"возраст": 30
}
Причина: Каждая открывающая кавычка должна иметь закрывающую.
5. Незакрытые скобки
❌ Ошибка:
{
"пользователь": {
"имя": "Иван",
"возраст": 30
},
"активен": true
Сообщение об ошибке:
Unexpected end of JSON input
✅ Решение:
{
"пользователь": {
"имя": "Иван",
"возраст": 30
},
"активен": true
}
Причина: Каждая открывающая скобка { должна иметь закрывающую }.
6. Комментарии в JSON
❌ Ошибка:
{
// Это комментарий
"имя": "Иван",
/ Многострочный
комментарий /
"возраст": 30
}
Сообщение об ошибке:
Unexpected token / in JSON at position 4
✅ Решение 1: Удалить комментарии
{
"имя": "Иван",
"возраст": 30
}
✅ Решение 2: Использовать специальное поле
{
"_комментарий": "Информация о пользователе",
"имя": "Иван",
"возраст": 30
}
Причина: JSON не поддерживает комментарии по спецификации.
7. Незакавыченные ключи
❌ Ошибка:
{
имя: "Иван",
возраст: 30
}
Сообщение об ошибке:
Unexpected token и in JSON at position 4
✅ Решение:
{
"имя": "Иван",
"возраст": 30
}
Причина: Все ключи должны быть в двойных кавычках.
Ошибки типов данных
8. Неправильные булевы значения
❌ Ошибка:
{
"активен": True,
"удален": FALSE,
"верифицирован": yes
}
Сообщение об ошибке:
Unexpected token T in JSON at position 15
✅ Решение:
{
"активен": true,
"удален": false,
"верифицирован": true
}
Причина: JSON использует только true и false в нижнем регистре.
9. Undefined вместо null
❌ Ошибка:
{
"отчество": undefined,
"телефон": undefined
}
Сообщение об ошибке:
Unexpected token u in JSON at position 16
✅ Решение:
{
"отчество": null,
"телефон": null
}
Причина: JSON не поддерживает undefined, используйте null.
10. NaN и Infinity
❌ Ошибка:
{
"результат": NaN,
"бесконечность": Infinity,
"отрицательная": -Infinity
}
Сообщение об ошибке:
Unexpected token N in JSON at position 16
✅ Решение 1: Использовать null
{
"результат": null,
"бесконечность": null,
"отрицательная": null
}
✅ Решение 2: Использовать строки
{
"результат": "NaN",
"бесконечность": "Infinity",
"отрицательная": "-Infinity"
}
Причина: JSON не поддерживает NaN и Infinity.
11. Ведущие нули в числах
❌ Ошибка:
{
"код": 007,
"номер": 0123
}
Сообщение об ошибке:
Unexpected number in JSON at position 10
✅ Решение: Использовать строки для кодов
{
"код": "007",
"номер": 123
}
Причина: Ведущие нули не допускаются в числах JSON.
Ошибки структуры
12. Дублирующиеся ключи
❌ Проблема:
{
"имя": "Иван",
"возраст": 30,
"имя": "Петр"
}
Поведение: Не вызывает ошибку парсинга, но последнее значение перезаписывает предыдущее.
Результат:
{ имя: "Петр", возраст: 30 }
✅ Решение: Удалить дубликаты
{
"имя": "Петр",
"возраст": 30
}
13. Смешанные типы в массиве
⚠️ Технически валидно, но может вызвать проблемы:
{
"данные": [
"строка",
42,
true,
null,
{"объект": "значение"},
["массив"]
]
}
✅ Лучше: Согласованные типы
{
"строки": ["строка1", "строка2"],
"числа": [42, 100],
"объекты": [
{"id": 1},
{"id": 2}
]
}
14. Пустые ключи
❌ Проблема:
{
"": "пустой ключ",
"нормальный_ключ": "значение"
}
Технически валидно, но избегайте:
✅ Лучше:
{
"пустое_значение": null,
"нормальный_ключ": "значение"
}
Ошибки кодировки
15. Неправильная кодировка
❌ Проблема: Файл сохранен не в UTF-8
Иван // Вместо "Иван"
✅ Решение:
В VS Code:1. Нижний правый угол → выбор кодировки
Выбрать "UTF-8"
Сохранить файл
В командной строке:
# Конвертация в UTF-8
iconv -f WINDOWS-1251 -t UTF-8 input.json > output.json
16. BOM (Byte Order Mark)
❌ Проблема: Файл имеет BOM в начале
Unexpected token in JSON at position 0
✅ Решение:
В Node.js:const fs = require('fs');
// Чтение без BOM
const содержимое = fs.readFileSync('файл.json', 'utf8').replace(/^/, '');
const данные = JSON.parse(содержимое);
В VS Code: Сохранить как UTF-8 без BOM
Ошибки экранирования
17. Неправильное экранирование
❌ Ошибка:
{
"путь": "C:UsersIvanDocuments",
"текст": "Он сказал "Привет""
}
Сообщение об ошибке:
Unexpected token U in JSON at position 12
✅ Решение:
{
"путь": "C:\Users\Ivan\Documents",
"текст": "Он сказал "Привет""
}
Правильное экранирование:
\\- обратный слэш\"- двойная кавычка\/- прямой слэш\n- новая строка\r- возврат каретки\t- табуляция
18. Управляющие символы
❌ Ошибка:
{
"текст": "Строка с
новой строкой"
}
✅ Решение:
{
"текст": "Строка с\nновой строкой"
}
Программные ошибки
19. Circular References (JavaScript)
❌ Ошибка:
const объект = { имя: "Иван" };
объект.self = объект; // Циклическая ссылка
JSON.stringify(объект);
// TypeError: Converting circular structure to JSON
✅ Решение 1: Удалить циклические ссылки
const объект = { имя: "Иван" };
// Не добавлять self
✅ Решение 2: Использовать replacer
const seen = new WeakSet();
JSON.stringify(объект, (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return; // Пропустить циклическую ссылку
}
seen.add(value);
}
return value;
});
20. Неправильная сериализация
❌ Проблема:
const данные = {
дата: new Date(),
функция: () => console.log("hi"),
символ: Symbol("test"),
undefined: undefined
};
console.log(JSON.stringify(данные));
// {"дата":"2026-01-26T10:00:00.000Z"}
// Функция, символ и undefined потеряны!
✅ Решение: Предварительная обработка
const подготовленныеДанные = {
дата: данные.дата.toISOString(),
// Сохранить функцию как строку, если нужно
функция: данные.функция.toString(),
// Преобразовать undefined в null
значение: данные.undefined === undefined ? null : данные.undefined
};
JSON.stringify(подготовленныеДанные);
Инструменты для отладки
1. Online валидаторы
JSONLint:1. Открыть jsonlint.com
Вставить JSON
Нажать "Validate JSON"
Увидеть ошибки с номерами строк
JSON Formatter:
jsonformatter.org
- Показывает точное место ошибки
- Предлагает исправления
2. Командная строка
jq:# Валидация файла
jq empty файл.json
# Если валиден - нет вывода
# Если ошибка - показывает детали
# Вывод ошибки:
parse error: Expected separator between values at line 3, column 12
Python:
# Валидация
python -m json.tool файл.json
# Детальная ошибка
python -c "import json; json.load(open('файл.json'))"
3. Программная валидация
JavaScript:function валидироватьJSON(строка) {
try {
JSON.parse(строка);
return { валиден: true };
} catch (ошибка) {
return {
валиден: false,
ошибка: ошибка.message,
// Попытка найти позицию
позиция: ошибка.message.match(/position (\d+)/)?.[1]
};
}
}
const результат = валидироватьJSON('{"имя":"Иван",}');
if (!результат.валиден) {
console.error('Ошибка JSON:', результат.ошибка);
console.error('Позиция:', результат.позиция);
}
Python с подробными ошибками:
import json
def валидировать_json(строка):
try:
json.loads(строка)
return {"валиден": True}
except json.JSONDecodeError as e:
return {
"валиден": False,
"ошибка": str(e),
"строка": e.lineno,
"колонка": e.colno,
"позиция": e.pos
}
результат = валидировать_json('{"имя":"Иван",}')
if not результат["валиден"]:
print(f"Ошибка на строке {результат['строка']}, колонка {результат['колонка']}")
print(f"Сообщение: {результат['ошибка']}")
Предотвращение ошибок
1. Используйте линтеры
ESLint для JavaScript:{
"extends": ["plugin:json/recommended"],
"plugins": ["json"]
}
VS Code настройки:
{
"json.validate.enable": true,
"json.schemas": [
{
"fileMatch": [".json"],
"url": "http://json-schema.org/draft-07/schema#"
}
]
}
2. Автоматическое форматирование
Prettier:{
"trailingComma": "none",
"tabWidth": 2,
"semi": false,
"singleQuote": false
}
Скрипт форматирования:
# package.json
{
"scripts": {
"format:json": "prettier --write '/.json'"
}
}
3. Pre-commit hooks
#!/bin/bash
# .git/hooks/pre-commit
for файл in $(git diff --cached --name-only --diff-filter=ACM | grep '.json$'); do
# Валидация
jq empty "$файл" 2>/dev/null || {
echo "❌ Ошибка валидации: $файл"
exit 1
}
# Форматирование
jq '.' "$файл" > "$файл.tmp" && mv "$файл.tmp" "$файл"
git add "$файл"
done
echo "✅ Все JSON файлы валидны"
4. Типизация (TypeScript)
interface Пользователь {
имя: string;
возраст: number;
email: string;
}
// Типобезопасное создание
const пользователь: Пользователь = {
имя: "Иван",
возраст: 30,
email: "ivan@example.com"
// Компилятор не позволит ошибки
};
const json = JSON.stringify(пользователь);
Чек-лист для отладки JSON
✅ Проверьте:
- [ ] Все ключи в двойных кавычках
- [ ] Все строки в двойных кавычках
- [ ] Нет запятых в конце
- [ ] Все скобки закрыты
- [ ] Нет комментариев
- [ ] Булевы значения в нижнем регистре (true/false)
- [ ] Используется null вместо undefined
- [ ] Нет ведущих нулей в числах
- [ ] Правильное экранирование специальных символов
- [ ] Файл сохранен в UTF-8
- [ ] Нет BOM
- [ ] Нет циклических ссылок
Заключение
Большинство ошибок JSON легко исправить, если знать их причины. Используйте валидаторы, линтеры и автоматическое форматирование для предотвращения ошибок.
Ключевые выводы:
- Всегда используйте двойные кавычки
- Следите за запятыми
- Используйте онлайн валидаторы для отладки
- Настройте автоматическую валидацию в вашем редакторе
- Используйте TypeScript для типобезопасности
- Автоматизируйте проверку с помощью pre-commit hooks
С правильными инструментами и практикой вы будете создавать безошибочный JSON!
Похожие статьи
Файл JSON: Полное руководство по работе с .json файлами
Узнайте всё о файлах JSON: как их создавать, открывать, редактировать и использовать в различных приложениях и языках программирования.
Как форматировать JSON: Полное руководство
Научитесь правильно форматировать JSON для улучшения читаемости. Инструменты, методы и лучшие практики форматирования JSON.
Лучшие инструменты JSON онлайн в 2026 году
Подробный обзор лучших онлайн инструментов для работы с JSON: валидаторы, форматеры, редакторы и конвертеры.