Как передаются массивы в JSON
Что проверяют
Синтаксис массива в JSON знают все, поэтому на самом деле проверяют, что происходит на границе JavaScript и JSON: что потеряется при JSON.stringify и что не восстановится после JSON.parse. Следом часто просят показать, как отправить массив в fetch или в строке запроса.
Как отвечать
Коротко про формат: массив это упорядоченный список в [], элементы через запятую, типы можно смешивать, корнем документа тоже может быть массив. Висячие запятые и комментарии недопустимы, JSON.parse на них бросит SyntaxError.
Главное в ответе, поведение сериализации:
undefined, функции иSymbol: внутри массива превращаются вnull, а в объекте поле с таким значением просто пропадает;NaNиInfinity: становятсяnull;- дырки разреженного массива: тоже
null; Date: уходит строкой черезtoJSON(), аJSON.parseобратно дату не создаст, нужен второй аргументreviver;MapиSet: превращаются в{}, их сначала переводят в массив черезArray.fromили спред;BigInt:JSON.stringifyбросаетTypeError.
Отправка: fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(items) }), на приёме await res.json(). Для GET массив кладут в строку запроса через URLSearchParams: вызывают append для каждого элемента, на сервере на Node читают через getAll. Формат повторяющегося ключа должен совпадать с тем, что ждёт бэкенд.
Где спотыкаются
Копируют данные через JSON.parse(JSON.stringify(x)) и теряют даты, undefined и Map. Для глубокой копии есть structuredClone, он эти типы сохраняет.
Забывают заголовок Content-Type и потом ищут, почему сервер видит пустое тело или строку вместо массива.
Не думают о числах: идентификатор больше Number.MAX_SAFE_INTEGER после JSON.parse молча округлится. Такие поля бэкенд должен отдавать строками.