← Вернуться к блогу

Распространённые ошибки JSON и их решения

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

Big JSON Team14 мин чтенияtroubleshooting
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

14 мин чтения

# Распространённые ошибки 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!

    Share:

    Похожие статьи

    Read in English