XML в JSON и обратно

Переведёт XML в JSON и JSON в XML по понятным правилам

Исходный XML
Можно нажать Ctrl V или перетащить файл — результат появится справа
Пусто
Результат

Как пользоваться

  1. Вставьте XML или JSON в поле «Исходный» или перетащите файл
  2. Выберите направление: XML → JSON или JSON → XML
  3. Результат появится сразу, под ним — памятка с правилами
  4. Скопируйте результат или скачайте файл .json или .xml

Примеры

Ответ SOAP-сервиса для фронтенда

Старый сервис отвечает XML, а фронтенду нужен JSON. Атрибут id станет ключом "@id", а элемент Total с атрибутом currency — объектом, где сумма лежит в "#text". Префиксы soap: остаются в именах ключей, как написаны.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Order id="1057">
      <Status>paid</Status>
      <Total currency="RUB">1490.00</Total>
    </Order>
  </soap:Body>
</soap:Envelope>

Каталог из 1С с одним и несколькими товарами

В этой выгрузке товар один, но в других их будет много. Включите «Всегда массивы», и "Товар" станет массивом даже из одного элемента — код, который его читает, не придётся писать для двух случаев. Артикул 00-00012345 останется строкой с нулями.

<КоммерческаяИнформация ВерсияСхемы="2.10">
  <Каталог>
    <Товары>
      <Товар>
        <Ид>4f1c-0017</Ид>
        <Артикул>00-00012345</Артикул>
        <Наименование>Кабель ВВГнг 3х2,5</Наименование>
      </Товар>
    </Товары>
  </Каталог>
</КоммерческаяИнформация>

Как XML превращается в JSON

У XML есть то, чего нет в JSON: атрибуты, текст рядом с вложенными элементами, повторяющиеся теги. Единого стандарта перевода нет, поэтому правила здесь простые и одинаковые во всём документе.

Элемент становится ключом с его именем. Атрибут — ключом "@имя". Элемент только с текстом — строкой, а если у него есть атрибуты или вложенные элементы, текст попадает в "#text". Пустой элемент без атрибутов — пустая строка "".

Если элемент хоть где-то в документе повторяется под тем же родителем, он становится массивом везде на этом пути — даже там, где встретился один раз. Так у всех записей одинаковая структура. Переключатель «Всегда массивы» делает массивом каждый элемент.

Все значения — строки: ИНН 0123456789, артикул 007 и сумма 1490.00 не превратятся в числа и не потеряют нули. Комментарии, инструкции обработки и объявление <?xml … ?> в JSON не переносятся, CDATA становится обычным текстом.

Было
<Товары>
  <Товар Ид="A-102">Автомат С16</Товар>
  <Товар Ид="A-117">Автомат С25</Товар>
</Товары>
Стало
{
  "Товары": {
    "Товар": [
      { "@Ид": "A-102", "#text": "Автомат С16" },
      { "@Ид": "A-117", "#text": "Автомат С25" }
    ]
  }
}

Как перевести JSON в XML

Переключите направление на JSON → XML. Действуют те же правила наоборот: ключ "@имя" — атрибут, "#text" — текст элемента, массив — повтор элемента с одним именем. Числа, true и false записываются текстом, null — пустым элементом. Результат начинается с объявления <?xml version="1.0" encoding="UTF-8"?>.

У XML один корневой элемент, поэтому у JSON на верхнем уровне должен быть один ключ. Если их несколько, мы предложим обернуть данные кнопкой «Обернуть в root». Ключ, который не может быть именем тега, например "1" или "a b", будет ошибкой с понятным текстом.

XML в JSON в коде и в 1С

В Python те же соглашения у библиотеки xmltodict: @ для атрибутов и #text для текста. Отличие в массивах — xmltodict решает отдельно для каждого места, поэтому один и тот же элемент бывает то объектом, то списком; параметр force_list это исправляет. В JavaScript популярна fast-xml-parser: по умолчанию она пропускает атрибуты вовсе (ignoreAttributes: true), а включённые пишет с префиксом @_; кроме того, значения, похожие на числа, она по умолчанию превращает в числа (parseTagValue).

В 1С готовой функции «XML в JSON» нет: документ читают через ЧтениеXML или ФабрикаXDTO и записывают через ЗаписьJSON, а как атрибуты и повторы ляжут в JSON, решает тот, кто пишет код. Чтобы проверить, какой JSON должен получиться, вставьте XML сюда и сравните.

Частые вопросы

Почему числа в JSON в кавычках

В XML всё — текст, и по самому значению не понять, число это или код. ИНН 0123456789 как число потерял бы ноль, а сумма 1490.00 стала бы 1490. Поэтому все значения переносятся строками без изменений.

Почему элементы оказались не в том порядке

Элементы с одним именем собираются в один массив, даже если между ними стояли другие. JSON-объект не умеет хранить ключи вперемешку, и мы предупредим, если порядок изменился.

Что происходит с пространствами имён

Префиксы остаются в именах ключей, как написаны: "soap:Envelope". Объявления xmlns становятся обычными атрибутами "@xmlns:soap", поэтому при обратном переводе в XML пространства имён восстановятся.

Сохранятся ли комментарии

Нет: в JSON комментариев нет. Под результатом будет подпись, что комментарии и объявление XML не перенесены.

Можно ли получить XML обратно из этого JSON

Да, правила работают в обе стороны: @ — атрибуты, #text — текст, массивы — повторы. Данные вернутся теми же, а комментарии и исходные отступы — нет.

Куда уходят мои данные

Никуда. Конвертация работает в браузере, запросы на чужие адреса запрещены заголовком безопасности. Ответы сервисов и выгрузки 1С остаются на вашем компьютере.

Другие инструменты