JSON ⟷ XML

Не вставляйте боевые .env с паролями и токенами: файл уходит на сервер для разбора.

Куда попадают атрибуты XML

В отдельный ключ @attributes рядом с содержимым элемента. Например, <price currency="RUB">100</price> при переводе в JSON станет {"@attributes":{"currency":"RUB"},"@value":"100"} — иначе атрибуты и текст элемента было бы просто некуда деть одновременно в одном значении. Маркер работает только в эту сторону: если оставить ключ @attributes в самом JSON и перевести его в XML, инструмент воспримет его как обычный ключ и получит служебный тег вида <_attributes key="@attributes">, а не настоящие атрибуты элемента — их для XML нужно расставлять вручную.

Что теряется при переводе JSON → XML → JSON

Пять ограничений, проверенных напрямую замером, а не предположением:

Как повторяющиеся теги становятся списком

Если внутри одного родителя несколько раз встречается тег с одинаковым именем, при чтении назад в JSON они превращаются в массив по этому ключу. Тег, встреченный один раз, остаётся одиночным значением, а не массивом из одного элемента — граница между «один» и «список из одного» в самом XML не выражена, и конвертер её не выдумывает.

Почему документы с DOCTYPE не принимаются

DOCTYPE в XML позволяет объявлять внешние сущности и через них подставлять содержимое произвольных файлов сервера — атака XXE. Инструмент отклоняет любой XML с DOCTYPE ещё до разбора документа, независимо от того, что в объявлении на самом деле написано.

Если ключ JSON не годится в имя тега

Если ключ можно превратить в валидное имя заменой недопустимых символов на подчёркивание, элемент получает такое имя, а исходный ключ сохраняется в атрибуте key. Если и это не подходит (например, ключ — число или начинается с цифры), элемент называется item, а исходный ключ хранится в атрибуте key (для строк) или index (для чисел, включая исходные индексы разреженных списков) — значение не теряется, даже если подходящее имя тега подобрать не удалось.

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

Куда попадают атрибуты XML при переводе в JSON?

В отдельный ключ @attributes рядом с содержимым элемента. Например, <price currency="RUB">100</price> при переводе в JSON становится {"@attributes":{"currency":"RUB"},"@value":"100"} — иначе атрибуты и текст элемента было бы просто некуда деть одновременно.

Работает ли @attributes в обратную сторону — при записи JSON в XML?

Нет: маркер @attributes распознаётся только при чтении XML → JSON. Если оставить ключ @attributes в самом JSON и сконвертировать его в XML, инструмент воспримет его как обычный ключ и получит служебный тег вида <_attributes key="@attributes">, а не атрибуты элемента. Чтобы получить настоящие XML-атрибуты, их нужно расставлять вручную в уже готовом XML.

Что теряется при переводе JSON → XML → JSON?

Пять вещей, проверенных напрямую: значения после круга становятся строками, потому что XML не хранит типы — 5432 и true превращаются в "5432" и "true"; null и пустая строка после круга неразличимы — оба возвращаются как ""; {} и [] неразличимы уже на этапе разбора самого JSON, поэтому оба возвращаются как пустой массив []; смешанное содержимое тега (текст вперемешку с вложенными тегами, например <a>текст1<b>x</b>текст2</a>) теряет весь текст — остаются только вложенные теги; и значимые пробелы по краям текста обрезаются — " отступ " превращается в "отступ".

Как повторяющиеся теги становятся списком?

Если внутри одного родителя несколько раз встречается тег с одинаковым именем, при чтении назад в JSON они превращаются в массив по этому ключу. Тег, встреченный один раз, остаётся одиночным значением, а не массивом из одного элемента — эту границу в самом XML нечем выразить, и инструмент её не выдумывает.

Почему документы с DOCTYPE не принимаются?

DOCTYPE в XML позволяет объявлять внешние сущности и через них подставлять содержимое произвольных файлов сервера — атака XXE. Инструмент отклоняет любой XML с DOCTYPE ещё до разбора документа, независимо от того, что в объявлении на самом деле написано.

Что происходит, если ключ JSON не годится в имя XML-тега?

Если ключ можно превратить в валидное имя заменой недопустимых символов на подчёркивание, элемент получает такое имя, а исходный ключ сохраняется в атрибуте key. Если и это не подходит (например, ключ — число или начинается с цифры), элемент называется item, а исходный ключ хранится в атрибуте key (для строк) или index (для чисел, включая исходные индексы разреженных списков).

Другие конвертеры

JSON ⟷ PHP-массив, универсальный конвертер конфигов (JSON, YAML, .env, PHP-массив, XML, CSV), JSON ⟷ YAML, CSV ⟷ JSON, а также остальные инструменты.

Нужна разработка или консультация?

Опишите задачу — отвечу и предложу формат работы.

Обсудить задачу