> Какие типы могут быть ключами в JSON (JavaScript)

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

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

Стек: JavaScript

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

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

В JSON ключами могут быть только строки. В отличие от JavaScript-объектов, где ключи автоматически приводятся к строкам, формат JSON строго ограничен: имя свойства всегда заключается в двойные кавычки. Числа, булевы значения, null, массивы и объекты в качестве ключей недопустимы. При парсинге JSON.parse все ключи становятся строками, даже если в исходном тексте они выглядели как числа.

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

JSON - это текстовый формат, основанный на подмножестве синтаксиса JavaScript, но с более строгими правилами. Спецификация RFC 8259 определяет объект как неупорядоченное множество пар "имя: значение", где имя - это строка. Это принципиальное отличие от JavaScript-объектов, где ключом может быть любой тип (число, символ, boolean), но при этом он неявно преобразуется в строку.

На практике это означает:

  • В JSON-файле или строке ключ всегда записывается в двойных кавычках: {"name": "value"}.
  • Одинарные кавычки или ключи без кавычек - синтаксическая ошибка.
  • Числовые ключи вроде {1: "one"} в JSON невалидны, хотя в JavaScript такой объект создастся с ключом "1".
  • После JSON.parse все ключи результирующего объекта - строки. Даже если исходный JSON содержал {"1": "one"}, доступ будет через obj["1"], а не obj[1] (хотя obj[1] тоже сработает из-за приведения типов в JS).

На практике

При работе с API и хранении данных важно помнить, что ключи JSON всегда строки. Это влияет на:

  • Сортировку: строковые ключи сортируются лексикографически, поэтому "10" будет идти перед "9".
  • Сериализацию: JSON.stringify преобразует числовые ключи объекта в строки автоматически.
  • Безопасность: ключи могут содержать любые Unicode-символы, включая пробелы и спецсимволы, что требует экранирования.
  • Производительность: доступ к свойствам по строковым ключам в V8 оптимизирован, но динамические ключи могут привести к деоптимизации.

Пример кода

JAVASCRIPT
// Валидный JSON - ключи только строки
const jsonString = '{"name": "Alice", "age": 30, "isAdmin": true}';
// Невалидный JSON - числовой ключ без кавычек
const invalidJson = '{1: "one"}'; // SyntaxError при JSON.parse
// Числовые ключи в JS-объекте
const obj = { 1: "one", true: "yes" };
console.log(Object.keys(obj)); // ["1", "true"] - всё строки
// JSON.stringify преобразует ключи
const result = JSON.stringify({ 2: "two", false: "no" });
console.log(result); // {"2":"two","false":"no"}
// Доступ после парсинга
const parsed = JSON.parse('{"1": "one"}');
console.log(parsed["1"]); // "one"
console.log(parsed[1]); // "one" - из-за приведения типов

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

Начни с прямого ответа: "только строки". Затем кратко объясни разницу между JSON и JavaScript-объектами. Упомяни, что при парсинге все ключи становятся строками, и приведите пример с числовым ключом. Если спросят про edge cases, расскажи про экранирование спецсимволов и Unicode. Не углубляйся в сортировку или производительность, если не попросят - это темы для senior-уровня.

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

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

  • Понимание формата JSON как строгого стандарта, а не просто "как в JS".
  • Знание поведения JSON.parse и JSON.stringify при работе с ключами.
  • Умение отличать синтаксис JSON от синтаксиса JavaScript-объектов.
  • Внимательность к деталям: например, что {"1": "one"} валиден, но ключ остаётся строкой.

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

  • Утверждение, что ключи могут быть числами или булевыми значениями - это неверно для JSON.
  • Путаница между JSON и JavaScript-объектами: в JS ключи всегда строки (или символы), но в JSON это требование явное.
  • Забывают, что одинарные кавычки в JSON недопустимы.
  • Считают, что JSON.parse('{"1": "one"}') создаст числовой ключ - на самом деле ключ строковый.
  • Не упоминают, что JSON.stringify автоматически приводит ключи к строкам, что может быть неочевидно при работе с числовыми ключами.

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

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