JSON в XML

Преобразуйте JSON в корректный XML в вашем браузере. Выберите имя корневого элемента, включите или отключите объявление XML и выберите отступ 2 пробела, 4 пробела или без отступа.

Сопоставьте дерево JSON элементам безопасно. Вставьте JSON и получите корректный XML. Массивы становятся повторяющимися элементами, недопустимые имена ключей приводятся к корректным именам элементов, а объявление и отступ зависят только от вас.

Вывод XML

Сопоставляем JSON и XML без лишних проблем

Две модели не совпадают

JSON имеет шесть типов значений - объект, массив, строка, число, логическое значение и null - и каждое из них самоописывающее. XML имеет ровно один примитив: текст. Всё остальное - это структура из элементов и атрибутов. Официального сопоставления между ними нет, поэтому каждый конвертер ведёт себя немного иначе.

Используемое здесь соглашение - самое распространённое и предсказуемое. Объект становится элементом, дочерними элементами которого являются его ключи. Строка, число или логическое значение становятся элементом, содержащим свою текстовую форму. null становится пустым элементом. Остаются массивы, для которых в XML нет аналога: стандартный обходной приём - повторить родительский элемент по одному разу на элемент, поэтому {"item": [1, 2]} превращается в <item>1</item><item>2</item>, а не изобретает обёрточный элемент, которого принимающая схема не ожидает.

Не каждый ключ JSON - допустимое имя элемента

Имена элементов XML следуют правилу NCName: они начинаются с буквы или подчёркивания, затем допускаются буквы, цифры, дефисы, точки и подчёркивания. Никаких пробелов, слэшей, ведущих цифр и ничего, начинающегося с букв xml в любом регистре, что зарезервировано спецификацией.

Ключи JSON таких ограничений не имеют - это произвольные строки, и реальные данные полны "user name", "2024" и "@type". Выдача их дословно создаёт документ, который не примет ни один парсер. Поэтому недопустимые символы заменяются подчёркиваниями, а при начале имени с цифры добавляется ведущее подчёркивание. Это необратимый шаг, поэтому если имена элементов важны дальше по цепочке, переименуйте ключи в JSON заранее, а не позволяйте конвертеру угадывать.

Объявление, отступ и что безопасно менять

Объявление <?xml ... ?> необязательно для документов UTF-8; при его отсутствии парсеры предполагают UTF-8. Включайте его, когда файл будет записан на диск, отдан по HTTP или передан строгому корпоративному конвейеру, и опускайте, когда фрагмент встраивается внутрь большего документа, где второе объявление - фатальная ошибка.

Отступ - более тонкий выбор. В отличие от JSON, пробелы внутри элемента XML являются частью содержимого, поэтому pretty-print технически меняет документ: элемент, содержавший Ada, теперь содержит перенос строки, несколько пробелов, Ada, перенос строки и ещё пробелы. Бóльшая часть схем игнорирует это, но проверка подписи, секции xml:space="preserve" и форматы, чувствительные к пробелам, - нет. Используйте отступ, пока читаете, и переключайтесь на минифицированный вывод для всего, что будет потреблять машина.

Примечание об открытом ПО: реализовано на чистом JavaScript без сторонних библиотек.

Часто задаваемые вопросы

Мой JSON куда-либо загружается?
Нет. Документ разбирается и сериализуется полностью в вашем браузере с использованием встроенных функций JSON, поэтому ничего не отправляется на сервер.
Как представляются массивы JSON?
Путём повторения родительского элемента по одному разу на элемент. {"item": [1, 2]} превращается в <item>1</item><item>2</item>, что соответствует соглашению, которого ожидает бóльшая часть схем XML.
Что происходит с ключами, не являющимися допустимыми именами элементов?
Недопустимые символы становятся подчёркиваниями, и добавляется ведущее подчёркивание, если имя начинается с цифры. Переименуйте ключи заранее, если точные имена важны.
Почему в моём выводе нет объявления XML?
Оно необязательно и управляется флажком. Без него парсеры по умолчанию используют UTF-8, и его нужно опустить, когда вывод встраивается внутрь другого документа.
Значения записываются как атрибуты?
Нет. Каждое значение становится текстом элемента. Атрибуты нельзя вывести из обычного JSON, поэтому их выбор потребовал бы схемы, которой у этого инструмента нет.
Меняет ли отступ смысл документа?
Технически да, потому что пробелы внутри элемента - это содержимое. Бóльшая часть схем игнорирует это, но используйте минифицированный вывод для подписанного или чувствительного к пробелам XML.