Можно ли вложить XML в JSON и JSON в XML
Что проверяют
Различаете ли вы вложение и конвертацию. Вложить один формат в другой можно всегда, вопрос в том, становится ли содержимое строкой или частью структуры. Следом обычно спрашивают, как вы опишете такое поле в спецификации интеграции и кто будет его разбирать.
Как отвечать
Короткий ответ: да, в обе стороны, но это два разных сценария.
- XML внутри JSON: документ кладётся строкой в значение поля. Кавычки и переводы строк экранируются по правилам JSON (
\",\n), и для получателя это просто текст, пока он сам не вызовет XML-парсер. При цифровой подписи документ иногда передают в Base64; - JSON внутри XML: строка становится текстом элемента. Символы
<и&нужно экранировать или обернуть содержимое в секцию<![CDATA[ ... ]]>. Внутри CDATA не может встретиться последовательность]]>, это частая ловушка; - конвертация структуры: элементы XML превращаются в ключи JSON и обратно. Здесь появляются потери: у XML есть атрибуты, пространства имён, порядок элементов и смешанный контент, у JSON есть типы (число,
true,null) и массивы. Один элемент<item>и массив из одного элемента без схемы неотличимы. Есть соглашения вроде BadgerFish, в XSLT 3.0 есть функцииjson-to-xml()иxml-to-json(), но единого стандарта маппинга нет.
Типичный случай для аналитика: легаси-сервис на SOAP отдаёт XML, шлюз заворачивает его в поле JSON-ответа REST API. В спецификации такое поле описывается как string с указанием формата содержимого, ссылкой на XSD и ответственным за разбор. Если выбрана конвертация, в документе нужна таблица маппинга: что делаем с атрибутами, как отличаем массив от одиночного элемента, как передаём типы.
Где спотыкаются
Смешивают два сценария. Утверждают, что при вложении XML в JSON теряются атрибуты, хотя строка передаётся целиком. Теряется что-то только при конвертации.
Забывают про экранирование. Строку собирают конкатенацией, и первая же кавычка или амперсанд в данных ломает документ у получателя.
Не фиксируют в требованиях, кто и когда разбирает вложенный документ. В итоге одна команда ждёт объект, другая присылает строку, и расхождение всплывает только на интеграционном тестировании.