Как лучше обработать ошибки парсинга JSON в Java
Что проверяют
Умеете ли вы отличить битый JSON от JSON, который не совпал с моделью, и что делаете в каждом случае. Следом обычно спрашивают, что ваш REST-сервис вернёт клиенту, приславшему кривое тело, и как не уронить весь пакет из-за одной записи.
Как отвечать
Начните с иерархии исключений Jackson 2, основной библиотеки в Spring Boot 3:
JsonParseException: сломан синтаксис, незакрытая скобка или лишняя запятая;MismatchedInputExceptionиInvalidFormatException: JSON валиден, но тип не тот, например строка"abc"в полеint;UnrecognizedPropertyException: пришло лишнее поле при включённомFAIL_ON_UNKNOWN_PROPERTIES(в чистомObjectMapperJackson 2 он включён по умолчанию);JsonProcessingException: общий проверяемый предок, его ловят, когда разбирать случаи не нужно.
Стоит упомянуть, что в Jackson 3 базовый JacksonException стал непроверяемым, а у Gson ошибка синтаксиса одна и тоже непроверяемая: JsonSyntaxException.
Дальше по слоям. В контроллере Spring ошибка чтения тела превращается в HttpMessageNotReadableException; его обрабатывают в @RestControllerAdvice и отвечают 400 с ProblemDetail, не отдавая наружу стек. В потоке сообщений, например из Kafka, битую запись логируют и отправляют в dead letter topic, чтобы очередь не встала. В лог пишут место ошибки: getLocation() даёт строку и столбец, getPathReference() путь до поля.
Отдельно скажите про отсутствующие поля: Jackson на них не ругается, поле просто останется null. Обязательность проверяют после парсинга через Bean Validation (@NotNull, @Valid).
Где спотыкаются
Ловят Exception и возвращают null. Вызывающий код падает позже с NullPointerException, и причина теряется.
Предлагают повторить попытку парсинга. Тот же вход даст ту же ошибку; повтор имеет смысл для сети, а не для разбора.
Пишут в лог весь входной JSON. Там бывают персональные данные и токены, а в сообщении Jackson уже есть фрагмент с местом ошибки.