В чём несовпадение
XML и JSON описывают разные миры, поэтому преобразование не бывает без потерь в обе стороны. В XML есть атрибуты, пространства имён, комментарии, инструкции обработки и упорядоченное смешанное содержимое. В JSON — объекты, массивы, строки, числа, булевы значения и null.
Конвертер делает три явных выбора:
| XML | JSON |
| --- | --- |
| Атрибут | ключ с префиксом @ |
| Текст рядом с атрибутами | ключ #text |
| Повторяющееся имя элемента | массив |
Комментарии и инструкции обработки отбрасываются: в JSON их некуда положить.
Ловушка повторяющихся элементов
Ответ с одним элементом даёт объект, тот же ответ с двумя — массив. Код, написанный под случай с одним элементом, ломается на втором — классическая авария в проде. Если вы потребляете преобразованный XML, приводите значение к массиву перед использованием — всегда.
Всё остаётся локально
Документ разбирает ваш браузер, поэтому выгрузка с записями клиентов или данными счетов до сервера не доходит.
Вопросы
Как представлены атрибуты?+
С префиксом @: атрибут currency становится ключом @currency рядом с #text для собственного текста элемента. Без префикса атрибут мог бы столкнуться с дочерним элементом того же имени, и результат зависел бы от порядка в документе — ровно тот баг, который всплывает через месяцы.
Почему один элемент стал массивом, а другой нет?+
Потому что в XML нет понятия списка: два соседних тега с одним именем — это просто два элемента. Когда имя повторяется, конвертер выдаёт массив; когда встречается один раз — значение. Если потребителю нужна стабильная форма, приводите её сами: это свойство отображения, а не выбор.
Можно преобразовать JSON обратно в XML?+
Да, переключите направление. У объекта должен быть ровно один ключ верхнего уровня, потому что в XML ровно один корневой элемент. Ключи, начинающиеся с @, становятся атрибутами, #text — текстом элемента.
Какой используется парсер?+
Встроенный DOMParser браузера. Он обрабатывает пространства имён, сущности, CDATA и объявления кодировки так, как предписывает спецификация, — самописный парсер в веб-странице этого не сделает.