Конвертеры данных · 6 минута чтения
От XML до JSON: решения, которые должен принять каждый
XML и JSON оба являются деревьями, поэтому преобразование между ними должно быть тривиальным, однако каждое преобразование XML в JSON, которое вы видели, давало разный результат. Это связано с тем, что XML несет информацию, а JSON не имеет места для атрибутов, смешанного текста и элементов, пространств имен и документов, в которых один и тот же тег встречается один или тысячу раз. Хороший преобразователь делает этот выбор явно, а не скрывает его.
Обновлено
Двусмысленность, которой не может избежать ни один преобразователь
Рассмотрим `<items><item>x</item></items>`. Должен ли `item` быть строкой или списком? XML ничего не говорит, и разница имеет значение в тот момент, когда вы пишете для него код: потребитель, ожидающий разрыва всегда массива при одноэлементном ответе, и потребитель, ожидающий, что объект сломается, когда прибудет второй элемент. Зрелые преобразователи позволяют принудительно создавать массивы для известных элементов списка, а не молча гадать, потому что предположение оказывается верным достаточно часто, чтобы достичь рабочей версии.
Атрибутам необходимо соглашение об именах
JSON не имеет атрибутов, поэтому атрибут должен стать либо родственным ключом, либо вложенным объектом. Широко используемое соглашение добавляет к именам атрибутов префиксы `@` — `<image src="a.png"/>` становится `{"@src": "a.png"}` — тогда как текст элемента помещается в зарезервированный ключ, например `#text`, когда элемент имеет и атрибуты, и содержимое. Какое бы соглашение ни использовал преобразователь, его следует применять последовательно, поскольку полупреобразованный XML хуже, чем непреобразованный XML.
<rss version="2.0"><channel><title>Feed</title></channel></rss>
→ {
"rss": {
"@version": "2.0",
"channel": { "title": "Feed" }
}
}
Пространства имен
Документы в пространстве имен — службы SOAP, карты сайта, форматы Office — определяют имена элементов как `ns:element`. JSON не имеет эквивалента, поэтому преобразователь либо удаляет префикс, либо сохраняет его как часть ключа, либо переупорядочивает документ вокруг URI пространства имен. Удаление его является обычным явлением, а иногда и катастрофическим, когда два пространства имен используют одно и то же локальное имя. Если в вашем документе используются пространства имен, проверьте выходные данные на предмет коллизий, прежде чем доверять им, и предпочитайте сохранять префикс в ключе.
Где на самом деле используется это преобразование
- RSS и Atom-каналы — чтение каналов в JavaScript после конвертации становится намного проще.
- SOAP и устаревшие API — превращение ответа во что-то, что может использовать современный клиент.
- Карты сайта и файлы конфигурации — проверка структуры без редактора, понимающего схемы.
- Миграция данных — перемещение записей из системы эпохи XML в систему, основанную на JSON.
Верность в обе стороны — это миф. Преобразование XML в JSON и обратно редко возвращает исходный документ побайтно, поскольку порядок объявления, пробелы, комментарии и CDATA не сохраняются. Преобразуйте, когда вам нужно использовать данные в другом месте, а не в качестве стратегии резервного копирования.
Сначала проверьте, затем преобразуйте
Парсеры XML строго следят за незакрытыми тегами и недействительными объектами, а сообщения об ошибках обычно точны. Исправьте документ перед преобразованием: правильно сформированный ввод — единственный способ получить структуру JSON, достойную сохранения. Затем преобразование выполняется локально в браузере, что имеет значение, когда XML является экспортом клиента или ответом внутренней службы, и оно продолжает работать в автономном режиме.
от XML до JSON — часто задаваемые вопросы
Почему от XML до JSON в разных инструментах получается результат разной формы?
XML содержит атрибуты, пространства имен и повторяющиеся элементы, которые JSON не могут быть выражены напрямую, поэтому каждый инструмент выбирает соглашения — `@` для атрибутов, `#text` для контента, массивы для известных списков. Согласованный инструментарий имеет большее значение, чем то, какое соглашение вы выберете.
Как повторяющиеся элементы XML представлены в JSON?
Как массив, обычно безоговорочно для элементов, встречающихся более одного раза. Одиночные экземпляры могут оставаться объектами, если вы не принудительно создадите массивы для этого элемента, что является более безопасным выбором для всего, что может повторяться.
Могу ли я преобразовать ответ SOAP в JSON?
Да, хотя он будет содержать пространства имен и структуру конверта, которая не нужна большинству потребительского кода. Преобразуйте, а затем преобразуйте результат в соответствии с полезной нагрузкой, которая вам действительно нужна, вместо того, чтобы передавать конверт через приложение.
Инструменты, упомянутые в этом посте
Еще статьи для чтения
6 минута чтения
От YAML до JSON: конвертируем конфиги, не теряя рассудка
Преобразуйте YAML в JSON в браузере с поддержкой нескольких документов и точным расположением ошибок, а также ошибками YAML, которые незаметно нарушают конвейеры CI.
6 минута чтения
JSON форматтер: красивый, минимизированный и действительно
Средство форматирования JSON, которое красиво печатает, минимизирует и проверяет точные местоположения ошибок, а также пять синтаксических ошибок, стоящих почти за каждой недопустимой ошибкой JSON.
5 минута чтения
От CSV до JSON: от электронной таблицы к структурированным
Преобразование CSV в JSON в браузере — объясняются строки заголовков, разделители, правила кавычек и обработка типов, а также экспорт электронных таблиц, который нарушает работу парсеров.