Приходилось ли работать с форматами XML и JSON для обмена данными?
Что проверяют
Работали ли вы с библиотеками сериализации глубже, чем аннотация над полем, и помните ли про безопасность разбора XML. Второе для многих интервьюеров и есть главный вопрос.
Как отвечать
По JSON опорная библиотека это Jackson. Назовите ObjectMapper и его настройки: игнорирование неизвестных полей, вывод только непустых значений, модуль для типов java.time, чтобы дата не превращалась в набор чисел. Для крупных документов есть потоковый разбор, для частичного JsonNode.
ObjectMapper mapper = JsonMapper.builder()
.addModule(new JavaTimeModule())
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.build();По XML вариантов больше: JAXB для маппинга классов, расширение Jackson для XML, если хочется закрыть оба формата одной моделью, StAX для потокового чтения крупных файлов, DOM только для небольших документов.
Обязательно скажите про XXE: парсер XML по умолчанию готов подтянуть внешнюю сущность, то есть прочитать файл с диска или сходить в сеть по указанию того, кто прислал документ. Лечится запретом DTD и внешних сущностей на фабрике парсера. Рядом упомяните, что автоматическое определение типа по полю в JSON опасно по схожей причине.
Где спотыкаются
Создают ObjectMapper в каждом методе. Он потокобезопасен после настройки и делается один на приложение, а пересоздание заметно стоит и теряет конфигурацию, из-за чего формат дат в разных местах разъезжается.
Не думают о совместимости. По умолчанию неизвестное поле во входящих данных валит разбор, и добавление партнёром одного поля роняет интеграцию. Обратная крайность не лучше: молча глотать всё подряд, не проверяя обязательные поля.
Считают JAXB частью стандартной поставки. Модули Java EE из JDK вынесены, зависимость подключается отдельно, и это регулярно всплывает при переезде на свежую версию. Ещё чаще всплывает java.time без подключённого модуля: в выводе оказывается структура из полей вместо строки по стандарту.