> Какие ошибки могут возникнуть при работе с 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 тесты для граничных случаев.
Пример кода
JAVAObjectMapper 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, вложенные массивы).
> Похожие задачи по Java
Приходилось ли работать с форматами XML и JSON для обмена данными?
Какие инструменты и библиотеки используются для сериализации и десериализации JSON в Java
Можно ли из класса контроллера в Java вернуть объект, который сериализуется в JSON
Есть ли в Kotlin аналог equals и hashCode и как это реализовано
> Похожие задачи по backend
Приходилось ли работать с форматами XML и JSON для обмена данными?
Какие инструменты и библиотеки используются для сериализации и десериализации JSON в Java
Можно ли из класса контроллера в Java вернуть объект, который сериализуется в JSON
Как реализовать чтение JSON по строкам с использованием потоков
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью