CodeKitHub
Інструменти JSON

Конвертер JSON ↔ XML

Останнє оновлення:

Щоб конвертувати JSON у XML, кожен ключ стає тегом елемента, а кожне значення — його текстовим вмістом — вкладені об'єкти стають вкладеними елементами, масиви стають повторюваними сусідніми елементами, а атрибути XML відображаються у ключі `@_name` в JSON, щоб зворотна конвертація залишалася без втрат. Цей інструмент виконує цю конвертацію в обох напрямках, повністю у вашому браузері.

Що це за інструмент?

XML і JSON — обидва деревоподібні формати даних, але вони зустрічаються в різних місцях: застарілі корпоративні API, сервіси SOAP, стрічки RSS/Atom та багато конфігураційних форматів досі використовують XML, тоді як сучасні REST API та код JavaScript майже виключно використовують JSON. Цей інструмент перекладає між ними, тож вам не потрібно вручну писати жоден із них при інтеграції старих і нових систем.

Конвертація побудована безпосередньо на API DOMParser браузера для читання XML, і слідує структурі, визначеній специфікацією W3C XML 1.0 для його створення — тож XML, який він генерує, коректно сформований, а XML, який він приймає, розбирається так само, як це зробив би браузер чи будь-яка сумісна зі стандартами бібліотека XML.

Оскільки в XML є поняття, яких немає в JSON (атрибути, змішаний текстовий/елементний вміст, обов'язковий єдиний кореневий елемент), а в JSON є поняття, яких немає в XML (нативні масиви, булеві значення, числа), інструмент використовує задокументовану, широко вживану угоду: атрибут XML `name="value"` стає ключем JSON `"@_name": "value"`, текстовий вміст елемента стає або прямим рядковим значенням елемента (коли в нього немає дочірніх елементів чи атрибутів), або ключем `"#text"` поряд із будь-якими атрибутами, а повторювані сусідні елементи з однаковим тегом стають масивом JSON.

Навіщо його використовувати?

  • Двонаправлено — конвертуйте JSON у XML чи XML у JSON з того самого екрана.
  • Правильно обробляє вкладеність — вкладені об'єкти JSON стають вкладеними елементами XML і навпаки, на будь-якій глибині.
  • Масиви відображаються на повторювані елементи — масив JSON під ключем стає такою ж кількістю сусідніх елементів XML з однаковим тегом, а повторювані теги XML повертаються як масив JSON.
  • Атрибути XML зберігаються — за допомогою угоди `@_attributeName`, тож дані атрибутів не відкидаються тихо.
  • Копіювання в буфер обміну чи завантаження як файлу .json чи .xml.
  • 100% на боці клієнта — те, що ви вставляєте, нікуди не завантажується.

Як користуватися

  1. Оберіть напрямок: "XML → JSON" чи "JSON → XML".
  2. Вставте свої дані в поле вводу.
  3. Натисніть "Конвертувати".
  4. Перегляньте результат, потім скопіюйте його або натисніть "Завантажити", щоб зберегти файл.

Приклад

Введення

{"user":{"name":"Alice","age":30}}

Результат

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <name>Alice</name>
  <age>30</age>
</user>

Єдиний ключ верхнього рівня JSON ("user") стає кореневим елементом XML; якщо в JSON більше одного ключа верхнього рівня, інструмент обгортає все в елемент <root>, оскільки XML вимагає рівно одного кореня.

Практичні поради

  • Міграція застарілої конфігурації XML (наприклад, файлу налаштувань старого застосунку) у сучасну систему на основі JSON: вставте XML, конвертуйте і за потреби відкоригуйте імена полів.
  • Тестування точки доступу SOAP чи XML-RPC з JavaScript: конвертуйте свій payload запиту JSON у XML тут перед надсиланням, або конвертуйте відповідь XML назад у JSON, щоб легко її перевірити.
  • Якщо ваш JSON використовує масиви для даних, які XML представляв би повторюваними елементами, переконайтеся, що масив спочатку вкладений під один ключ (наприклад, {"items":{"item":[1,2,3]}}), а не голий масив верхнього рівня, оскільки XML не може мати кілька кореневих елементів.

Чому важлива угода про атрибути @_

Найскладніша частина конвертації JSON/XML полягає в тому, що елементи XML можуть одночасно нести два види даних — атрибути та дочірній вміст — тоді як звичайний об'єкт JSON має лише ключі та значення. Без угоди, щоб тримати їх окремо, наївний конвертер або повністю втратив би атрибути, або змішав би їх з дочірніми елементами так, що це неможливо надійно конвертувати назад. Угода про префікс `@_name` (яку також використовують широко прийняті бібліотеки в екосистемі JavaScript) вирішує це, надаючи атрибутам чітку, недвозначну форму ключа, тож `<product id="42">Widget</product>` чисто перетворюється туди й назад на `{"product":{"@_id":"42","#text":"Widget"}}`, замість того щоб втратити id чи неправильно вгадати, яке значення яким було.

Часті запитання

Що трапляється з JSON, у якому більше одного ключа верхнього рівня?

XML вимагає єдиного кореневого елемента, тож якщо ваш об'єкт JSON має кілька ключів верхнього рівня (наприклад, {"a":1,"b":2}), результат обгортається в елемент <root>: <root><a>1</a><b>2</b></root>. Якщо у вашому JSON рівно один ключ верхнього рівня, цей ключ безпосередньо стає іменем кореневого елемента.

Як атрибути XML представляються в JSON?

Атрибут на кшталт <user id="7"> стає ключем "@_id": "7" у результуючому об'єкті JSON. Це поширена, задокументована угода (яку використовують бібліотеки на кшталт fast-xml-parser), що дозволяє відрізняти атрибути від дочірніх елементів.

Чи стають повторювані елементи XML масивом JSON?

Так. Якщо елемент має кілька дочірніх елементів з однаковим іменем тега, наприклад <items><item>1</item><item>2</item></items>, конвертація в JSON дає {"items":{"item":["1","2"]}}. Конвертація цього JSON назад у XML відтворює повторювані елементи <item>.

Чи зберігаються числа та булеві значення при конвертації XML у JSON?

У XML немає нативного поняття чисел чи булевих значень — усе є текстом — тож текстовий вміст перетворюється на рядок JSON (наприклад, "30", а не 30). Якщо вам потрібні числові типи, вам потрібно буде конвертувати ці поля потім окремо.

Чи завантажуються мої дані кудись?

Ні. Розбір і конвертація відбуваються повністю у JavaScript у вашому браузері, використовуючи вбудований API DOMParser — нічого не надсилається на сервер, тож це безпечно використовувати з приватними конфігураційними файлами чи внутрішніми payload API.

Схожі інструменти