> Как передаются массивы в JSON (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: Сбер

Стек: JavaScript

> Пример ответа

Короткий ответ

В JSON массивы передаются как упорядоченные списки значений, заключённые в квадратные скобки []. Элементы разделяются запятыми. Каждый элемент может быть строкой, числом, объектом, другим массивом, true, false или null. При сериализации в JavaScript метод JSON.stringify() преобразует массив в строку JSON, а JSON.parse() восстанавливает его обратно.

Подробное объяснение

JSON (JavaScript Object Notation) - это текстовый формат обмена данными, основанный на синтаксисе JavaScript. Массивы в JSON представляют собой упорядоченные коллекции значений. Синтаксически они идентичны массивам JavaScript, но с ограничениями по типам данных.

Ключевые правила:

  • Массив начинается с [ и заканчивается ]
  • Элементы разделяются запятыми
  • Допустимые типы элементов: string (в двойных кавычках), number, object, array, boolean, null
  • Нельзя использовать undefined, функции, символы, BigInt - они либо удаляются, либо преобразуются в null
  • Последняя запятая (trailing comma) не допускается

При сериализации JSON.stringify() рекурсивно обрабатывает все вложенные элементы. Если массив содержит значения, не поддерживаемые JSON, они либо игнорируются (undefined в массиве превращается в null), либо вызывают ошибку (BigInt).

При десериализации JSON.parse() восстанавливает массив как экземпляр Array. Важно: порядок элементов сохраняется, но типы могут измениться - например, числа с плавающей точкой остаются числами, а строки остаются строками.

На практике

При передаче массивов через JSON нужно учитывать несколько практических аспектов:

  1. Глубокое копирование: JSON.parse(JSON.stringify(arr)) создаёт глубокую копию массива, но теряет методы, прототипы и специальные объекты (Date превращается в строку, Map/Set - в пустые объекты).

  2. Производительность: Для больших массивов (сотни тысяч элементов) сериализация может быть затратной. Используйте streaming-подходы или библиотеки вроде fast-json-stringify.

  3. Безопасность: Никогда не используйте eval() для парсинга JSON - только JSON.parse(). Валидируйте входные данные, особенно если массив содержит пользовательский ввод.

  4. Совместимость: Убедитесь, что сервер и клиент ожидают одинаковую структуру. Например, если сервер возвращает {"items": [...]}, клиент должен обращаться к data.items.

  5. Обработка ошибок: Всегда оборачивайте JSON.parse() в try-catch, так как невалидный JSON вызовет исключение.

Пример кода

JAVASCRIPT
// Сериализация массива
const users = [
{ id: 1, name: "Alice", active: true },
{ id: 2, name: "Bob", active: false }
];
const jsonString = JSON.stringify(users);
console.log(jsonString);
// [{"id":1,"name":"Alice","active":true},{"id":2,"name":"Bob","active":false}]
// Десериализация
const parsed = JSON.parse(jsonString);
console.log(parsed[0].name); // "Alice"
// Обработка специальных значений
const mixed = [1, "text", null, undefined, () => {}];
console.log(JSON.stringify(mixed)); // [1,"text",null,null,null]
// Вложенные массивы
const matrix = [[1, 2], [3, 4]];
console.log(JSON.stringify(matrix)); // [[1,2],[3,4]]
// Безопасный парсинг
try {
const data = JSON.parse(invalidJson);
} catch (e) {
console.error("Invalid JSON:", e.message);
}

Как отвечать на собеседовании

Начните с чёткого определения: массивы в JSON - это упорядоченные списки в квадратных скобках. Затем перечислите допустимые типы элементов. Упомяните, что JSON.stringify и JSON.parse - основные инструменты работы. Добавьте про ограничения: отсутствие undefined, функций, циклических ссылок. Если спросят про производительность, скажите, что для больших данных лучше использовать streaming. Покажите понимание практических проблем: глубокое копирование, безопасность, обработка ошибок. Завершите примером кода с try-catch.

Что проверяет интервьюер

Интервьюер оценивает:

  • Базовое понимание формата JSON и его отличий от объектов JavaScript
  • Знание методов JSON.stringify и JSON.parse с их особенностями (replacer, space)
  • Осведомлённость об ограничениях: какие типы данных не поддерживаются
  • Умение обрабатывать краевые случаи: undefined, null, циклические ссылки
  • Практические навыки: безопасный парсинг, глубокое копирование, работа с вложенными структурами
  • Понимание производительности и альтернатив для больших данных

Типичные ошибки

  1. Использование одинарных кавычек: JSON требует двойные кавычки для строк и ключей
  2. Trailing comma: [1, 2, 3,] вызовет ошибку парсинга
  3. Попытка сериализовать undefined или функцию: они будут удалены или заменены на null
  4. Игнорирование циклических ссылок: JSON.stringify выбросит TypeError
  5. Отсутствие try-catch при парсинге: невалидный JSON упадёт с ошибкой
  6. Предположение, что порядок ключей объекта гарантирован: в JSON порядок ключей не специфицирован, хотя в JavaScript обычно сохраняется
  7. Использование eval() вместо JSON.parse(): это серьёзная уязвимость безопасности

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью