Инструменты разработчика · Конвертеры синтаксиса
Преобразование JSON в XML: корневые элементы, массивы и недопустимые имена тегов
· Как это работает
JSON xml форматы данных
JSON может представлять собой пустой массив с ключами, начинающимися с цифр или содержащими пробелы, ни один из которых не допускается XML. В этом посте объясняются решения, которые преобразователь должен принять в отношении корней, массивов и имен, чтобы вы могли предсказать результат.
Массив без имени — массив JSON верхнего уровня, который должен стать однокорневым документом XML, и появляющийся элемент-оболочка.
JSON может начинаться с `[1,2]`; XML не может начинаться с двух одноранговых элементов документа. Таким образом, ToolAcre оборачивает корневой массив в выбранное корневое имя и записывает каждый элемент как повторяющийся дочерний элемент `<item>`. Предупреждение называет это соглашение, поскольку имена оболочки и элементов не присутствовали в источнике.
Выбор `numbers` дает один элемент документа `<numbers>`, содержащий два элемента item. Преобразование является детерминированным, но не каноническим: другой системе может потребоваться `<number>` или коллекция с атрибутами. Намеренно установите корень и сравните результат с требуемым получателем контрактом XML.
XML нужен ровно один корень — почему каждое преобразование изобретает или запрашивает имя корневого элемента
Документ XML должен иметь ровно один корневой элемент. Объект JSON, имеющий ровно один обычный ключ верхнего уровня, может использовать этот ключ напрямую. Объект с несколькими ключами, массив, скаляр или значение NULL не имеет единого имени, поэтому средство записи заключает его в `root`, если пользователь не предоставляет другое допустимое имя.
Правило оболочки реализуется перед сериализацией и отображается в виде предупреждения. Он не обнаруживается схемой и не утверждает, что `<root>` имеет значение для устаревшей службы. Присвоение имени конверту является частью проектирования интеграции, в то время как преобразователь гарантирует правильность структуры только при собственном сопоставлении.
Массивы не имеют эквивалента XML — повторение элемента для каждого элемента и представление массивов скаляров и массивов массивов.
Массивы становятся повторяющимися элементами. В корне документа участники используют `<item>` под оболочкой. Внутри объекта массив, хранящийся в `line`, становится повторяющимся дочерним элементом `<line>`. Массивы объектов создают повторяющиеся элементы с дочерними полями; вложенные массивы не имеют доменных имен и наследуют общую структуру, созданную компоновщиком.
При этом теряется различие между одним членом массива и скаляром с тем же именем элемента после более позднего чтения XML в JSON. XML предоставляет вхождения, а не независимый маркер массива. Если стабильная мощность имеет значение, ее должна обеспечить схема или сопоставление приложения; универсальный сериализатор не может доказать это только по именам элементов в форме JSON.
Ключи, которые не могут быть именами элементов — имена, начинающиеся с цифры, содержащие пробелы или знаки препинания или начинающиеся с «xml», а также то, как преобразователи переименовывают или экранируют их.
В схеме предложены преобразователи, которые могут переименовывать или экранировать недопустимые ключи. ToolAcre явно отказывает им. Ключ с пробелом, начинающийся с цифры или дефиса или начинающийся с зарезервированных букв `xml` запускает `UNSUPPORTED_SHAPE` и называет ошибочный путь. При тихом переименовании будет создано XML, не соответствующее ни одной согласованной схеме.
Допустимые имена могут начинаться с буквы, подчеркивания или префикса в стиле пространства имен и могут содержать цифры, точки, подчеркивания, двоеточия и дефисы после начала. Ключи атрибутов используют `@` только в соответствии с соглашением JSON; оставшееся имя атрибута должно пройти ту же проверку. Намеренно переименуйте исходный ключ или выберите другой целевой формат.
Ключи, которые не могут быть именами элементов, отклоняются, никогда не переименовываются и не экранируются.
Числа и логические значения сериализуются как текст элемента, поэтому их тип JSON больше не объявляется XML. Следовательно, обратный читатель по умолчанию возвращает строки. Null здесь не имеет представления XML: он становится пустым элементом, неотличимым от пустой строки, и средство записи сообщает, сколько значений претерпело это изменение.
Это означает, что `{ "a": null, "b": "" }` может создавать два пустых элемента, которые считываются одинаково. Назвать этот путь туда и обратно без потерь было бы неверно. Атрибуты `#text` и `#cdata` сохраняют структурное соглашение преобразователя, но не добавляют общую систему типов XML.
Типы становятся текстом XML, а значение null становится допустимой неоднозначностью пустого элемента.
Используйте `{"order":{"@id":"A-7","customer":"Ada","line":[{"sku":"P1","qty":2},{"sku":"P2","qty":1}],"note":null}}`. Одиночный ключ `order` становится корневым, `@id` становится атрибутом, каждый строковый объект становится повторяющимся `<line>`, а значение null становится пустым `<note></note>` с предупреждением.
Прочитайте вывод обратно с отключенным выводом. Идентификатор атрибута, количество и текстовые значения представляют собой строки, а строка представляет собой массив, поскольку она появляется дважды. Это демонстрирует точную поддерживаемую инверсию, одновременно раскрывая потерянные нулевые и числовые типы. Схема заказа на получение может требовать других имен или порядка, которые в этом примере не проверяются.
Чего это не касается — создание XML, соответствующего данному XSD или пространству имен, для которого требуется сопоставление, написанное вручную.
Модуль записи не использует XSD, не назначает URI пространства имен и не определяет порядок элементов из бизнес-схемы. Он записывает объявление XML и никогда не генерирует DOCTYPE. Ключи, содержащие префиксы пространства имен, сохраняются буквально, но это не является разрешением пространства имен или доказательством того, что префикс объявлен правильно.
Для создания XML, принятого конкретной службой, могут потребоваться атрибуты, ограничения последовательности, группы выбора и полные имена. Используйте его текущую схему или документацию для построения этого сопоставления. Общее преобразование подходит для проверки и простых документов, ориентированных на данные, и не заменяет сериализацию с учетом контракта.
Вывод: предскажите форму до того, как вы от нее зависите, и как панель преобразователей синтаксиса отображает структуру XML, которую создает документ JSON.
Предскажите конверт, названия предметов и потерю типа, прежде чем зависеть от результата. ToolAcre оборачивает значения, у которых нет одного корня, повторяет массивы, сопоставляет ключи `@` с атрибутами, заменяет значение null пустым текстом и отклоняет недопустимые имена, а не угадывает замены. Каждое неочевидное изменение отображается в выводе или предупреждениях.
Протестируйте самый маленький объект, который включает в себя массив верхнего уровня, повторяющиеся записи, значение NULL, числовой текст и неудобный ключ. Отказ является полезным доказательством того, что требуется ручное картирование. Успешный файл по-прежнему нуждается в проверке со стороны фактического получателя, поскольку правильно сформированный XML и действительный по схеме XML — это разные утверждения.
После того как получатель примет образец, добавьте обратную проверку только в тех случаях, когда ожидается, что картирование сохранится. Атрибуты и повторяющиеся дочерние элементы могут передаваться туда и обратно согласно собственному соглашению ToolAcre, тогда как нулевые и скалярные типы не могут. Запись этого различия предотвращает распространение успешного примера счастливого пути на каждый документ заказа, который может создать ваша интеграция.