> Какие ошибки могут возникнуть при работе с JSON в Java и как их обработать (Java)

Уровень: senior · Роль: backend · Язык: Java · Категория: Технические вопросы

Компании: ИТ-Экспертиза

Стек: Java

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

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

При работе с JSON в Java чаще всего возникают ошибки парсинга (JsonParseException, JsonMappingException), несоответствия типов (MismatchedInputException), проблемы с рекурсией, null-значениями и неизвестными полями. Обработка строится на перехвате исключений Jackson/Gson, настройке ObjectMapper (например, FAIL_ON_UNKNOWN_PROPERTIES), использовании DTO с аннотациями и валидации через Bean Validation. На senior-уровне важно учитывать streaming, безопасность и производительность.

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

В Java экосистеме доминируют Jackson и Gson. Основные категории ошибок: синтаксические (невалидный JSON), семантические (несовпадение структуры и типов), конфигурационные (неправильные настройки маппера), а также ошибки, связанные с безопасностью и производительностью.

Синтаксические ошибки: JsonParseException (Jackson) или JsonSyntaxException (Gson) возникают при повреждённом JSON. Семантические: MismatchedInputException при попытке десериализовать строку в число, массив в объект и т.п. UnrecognizedPropertyException - при неизвестных полях, если не отключён FAIL_ON_UNKNOWN_PROPERTIES. Проблемы с рекурсией: JsonMappingException: Infinite recursion при двунаправленных связях, решается @JsonIgnore, @JsonManagedReference/@JsonBackReference или DTO. Null-значения: NullPointerException при обращении к полям, которые не были инициализированы, или JsonMappingException при @JsonProperty(required = true). Также StackOverflowError при глубокой вложенности, OutOfMemoryError при больших объёмах - здесь помогает streaming API (JsonParser, JsonGenerator).

Обработка: локальный try-catch вокруг операций чтения/записи, глобальный @ControllerAdvice для REST, кастомные DeserializationProblemHandler, настройка ObjectMapper (например, configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)), использование Optional для nullable-полей, валидация через @Valid и Validator. Для безопасности: ограничение глубины, размера, отключение полиморфной десериализации по умолчанию (activateDefaultTyping - риск RCE).

На практике

В Spring Boot REST-контроллерах исключения Jackson транслируются в HttpMessageNotReadableException, которую можно обработать в @ExceptionHandler и вернуть 400 с деталями. Для внешних API используют RetryTemplate и fallback. При работе с большими файлами - MappingIterator или streaming, чтобы не держать всё в памяти. Для совместимости схем - @JsonAlias, @JsonSetter(nulls = Nulls.SKIP). Логирование ошибок должно включать исходный фрагмент JSON (осторожно с PII). Тесты: @JsonTest в Spring Boot, property-based тесты для граничных случаев.

Пример кода

JAVA
ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)
.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
try {
UserDto user = mapper.readValue(json, UserDto.class);
} catch (JsonParseException e) {
// синтаксическая ошибка
throw new BadRequestException("Invalid JSON syntax", e);
} catch (MismatchedInputException e) {
// несоответствие типов
throw new BadRequestException("Type mismatch: " + e.getPath().toString(), e);
} catch (JsonMappingException e) {
// общая ошибка маппинга
throw new BadRequestException("Mapping error", e);
} catch (IOException e) {
// I/O ошибка
throw new InternalServerException("IO error", e);
}

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

Структурируйте ответ: сначала перечислите категории ошибок (синтаксис, типы, конфигурация, рекурсия, null, безопасность), затем для каждой назовите исключение и способ обработки. Упомяните настройки ObjectMapper, @ControllerAdvice, streaming для больших данных. Покажите понимание trade-off между строгостью и гибкостью (например, FAIL_ON_UNKNOWN_PROPERTIES). Затроньте безопасность: полиморфная десериализация, ограничение размера. Приведите пример из практики.

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

Знание конкретных исключений Jackson/Gson, умение их обрабатывать на разных уровнях (локально, глобально), понимание конфигурации маппера, опыт работы с REST и валидацией, осведомлённость о security-рисках (CVE, RCE через полиморфизм), навыки streaming для больших объёмов, способность объяснить trade-off и выбрать решение под контекст.

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

Кандидаты путают JsonParseException и JsonMappingException, забывают про FAIL_ON_UNKNOWN_PROPERTIES, не упоминают @ControllerAdvice, игнорируют рекурсию и StackOverflowError, не знают про streaming API, недооценивают риски безопасности при activateDefaultTyping, предлагают catch (Exception e) без конкретики, не тестируют граничные случаи (пустой JSON, null, вложенные массивы).

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

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