Этот вопрос проверяет понимание обработки отсутствующих ключей в JSON и различий между null, отсутствием ключа и пустым массивом, что важно для устойчивого парсинга данных.
При работе с JSON, полученным из внешних источников (API, файлы), часто возникает неопределённость: что делать, если ожидаемый ключ с массивом отсутствует в данных? Важно понимать разницу между тремя состояниями: ключ отсутствует, ключ присутствует со значением null, ключ присутствует с пустым массивом []. Эти состояния обрабатываются по-разному при парсинге.
obj.key в JavaScript вернёт undefined, в Python — KeyError или None в зависимости от метода (.get()), в Java — null.null. При доступе вернёт null/nil/None.[]. Это валидный массив нулевой длины.Чтобы избежать ошибок, нужно явно задавать значение по умолчанию. Пример на JavaScript:
const jsonString = '{"name": "test"}'; // ключа "items" нет
const data = JSON.parse(jsonString);
// Небезопасно: может быть undefined или null
const unsafeItems = data.items; // undefined
// unsafeItems.length // TypeError
// Безопасный подход с логическим ИЛИ (||) или оператором нулевого слияния (??)
const items1 = data.items || []; // если data.items falsy (undefined, null, []), то []
const items2 = data.items ?? []; // если data.items null/undefined, то [] (но пустой массив останется)
// Явная проверка
let items3;
if (Array.isArray(data.items)) {
items3 = data.items;
} else {
items3 = [];
}
console.log(items3); // []Пример на Python с использованием метода .get():
import json
json_str = '{"name": "test"}'
data = json.loads(json_str)
# .get() возвращает None, если ключа нет, но можно указать default
items = data.get('items', []) # если ключа нет, вернёт []
# Однако, если значение может быть null, нужно дополнительная проверка
if items is None:
items = []
# Или используем тернарный оператор
items = data['items'] if 'items' in data and data['items'] is not None else []
print(items) # []Такая проверка критична при разработке API-клиентов, обработке конфигурационных файлов, чтении данных из баз. Она обеспечивает устойчивость к изменениям схемы данных и предотвращает сбои в цепочках обработки (например, при вызове .map(), .filter()).
Вывод: Всегда явно обрабатывайте отсутствующие ключи или null-значения, устанавливая пустой массив по умолчанию, чтобы код был предсказуемым и устойчивым к неполным данным.