← Все гайды

JSON Schema в XSD: конвертация схемы

· 2 мин чтения

JSON SchemaXSD

Как получить XSD из JSON Schema: определения становятся именованными типами, массивы — повторяющимися элементами, ограничения — фасетами; ссылки на другие файлы схем учитываются.

Обратная задача возникает, когда REST-сервису нужен XML-канал: обмен файлами с партнёром, госсистема, старая шина. Схему можно не переписывать вручную.

Как преобразовать

  1. Откройте схему в редакторе JSON Schema.
  2. Выберите Файл → Преобразовать в → XSD.
  3. Проверьте замечания и сохраните результат или откройте его в песочнице XSD — там схема сразу проверится и покажется диаграммой.
XSD, полученная из JSON Schema, на диаграмме
Результат в редакторе XSD: схема проверена, модель на диаграмме

Как переносятся конструкции

  • Корневой элемент — по title схемы (или по названию файла).
  • $defs и definitions — именованные xs:complexType и xs:simpleType; $ref — ссылки на них.
  • Свойства — элементы xs:sequence; не входящие в required — minOccurs="0".
  • Массивы — повторяющийся элемент: maxOccurs из maxItems или unbounded.
  • enum, minLength, maxLength, pattern, minimum, maximum — фасеты xs:restriction; format — встроенный тип (date → xs:date).
  • allOf с $ref — наследование через xs:extension; oneOf/anyOf — xs:choice.
  • Тип с null — элемент с nillable="true".
  • Свойства @имя — атрибуты, #text — текст элемента.

Что не выражается в XSD

Условные конструкции (if/then/else, not), patternProperties, dependentRequired в XML Schema 1.0 не выражаются и пропускаются — окно предупредит. Шаблон без ^…$ оборачивается в .*(…).*, потому что XSD сравнивает значение целиком.

Ссылки на другие файлы

Если схема ссылается на определения в других файлах ("$ref": "common.json#/$defs/Money") и хранится в проекте, эти определения найдутся по папкам и станут типами в той же XSD.

Пример

{
  "title": "order",
  "type": "object",
  "required": ["id"],
  "properties": {
    "id": {"type": "integer"},
    "tags": {"type": "array", "items": {"type": "string", "enum": ["a", "b"]}}
  }
}

превращается в

<xs:element name="order">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="id" type="xs:integer"/>
      <xs:element name="tags" minOccurs="0" maxOccurs="unbounded">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="a"/>
            <xs:enumeration value="b"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Вопросы и ответы

Можно ли задать targetNamespace? Схема создаётся без пространства имён. Добавьте targetNamespace и xmlns в корень результата — проверка сразу покажет, если ссылки на типы нужно дополнить префиксом.

Массив массивов — как он выглядит в XML? Внутренний массив передаётся элементами <item> — окно предупредит об этом.