Створити схему Json із схеми XML (XSD) [закрито]


79

Хтось знає, як створити схему JSON із існуючої схеми XML (файл XSD)? Чи є для цього доступні інструменти?


4
Я думаю, що справжнє запитання: "Чи можна зробити зіставлення між JSON Schema і XML Schema?" не є поза темою. Можливо, питання можна було б переформулювати.
Ерік Хартфорд,

1
Фалько Ногац в 2013 році зробив дисертацію на ступінь бакалавра, що призвело до xsd2json .
supervacuo

Один із способів - перейти від XSD до класів Java і від класів Java до схеми JSON. Деталі на dzone.com/articles/generating-json-schema-xsd .
koppor

Відповіді:


41

Застереження : Я є автором Jsonix , потужної бібліотеки зіставлення XML <-> JSON з відкритим кодом.

Сьогодні я випустив нову версію компілятора схем Jsonix з новою функцією генерації схеми JSON .

Візьмемо для прикладу схему Замовлення на придбання . Ось фрагмент:

  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>

  <xsd:complexType name="PurchaseOrderType">
    <xsd:sequence>
      <xsd:element name="shipTo" type="USAddress"/>
      <xsd:element name="billTo" type="USAddress"/>
      <xsd:element ref="comment" minOccurs="0"/>
      <xsd:element name="items"  type="Items"/>
    </xsd:sequence>
    <xsd:attribute name="orderDate" type="xsd:date"/>
  </xsd:complexType>

Ви можете скомпілювати цю схему, використовуючи наданий інструмент командного рядка:

java -jar jsonix-schema-compiler-full.jar
    -generateJsonSchema
    -p PO
    schemas/purchaseorder.xsd

Компілятор генерує відображення Jsonix , а також відповідну схему JSON .

Ось як виглядає результат (відредаговано для стислості):

{
    "id":"PurchaseOrder.jsonschema#",
    "definitions":{
        "PurchaseOrderType":{
            "type":"object",
            "title":"PurchaseOrderType",
            "properties":{
                "shipTo":{
                    "title":"shipTo",
                    "allOf":[
                        {
                            "$ref":"#/definitions/USAddress"
                        }
                    ]
                },
                "billTo":{
                    "title":"billTo",
                    "allOf":[
                        {
                            "$ref":"#/definitions/USAddress"
                        }
                    ]
                }, ...
            }
        },
        "USAddress":{ ... }, ...
    },
    "anyOf":[
        {
            "type":"object",
            "properties":{
                "name":{
                    "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/QName"
                },
                "value":{
                    "$ref":"#/definitions/PurchaseOrderType"
                }
            },
            "elementName":{
                "localPart":"purchaseOrder",
                "namespaceURI":""
            }
        }
    ]
}

Тепер ця схема JSON походить від оригінальної схеми XML. Це не зовсім трансформація 1: 1, але дуже близька.

Створена схема JSON збігається із створеними відображеннями Jsonix. Отже, якщо ви використовуєте Jsonix для XML <-> перетворення JSON, ви повинні мати можливість перевірити JSON за допомогою сформованої схеми JSON. Він також містить усі необхідні метадані із вихідної XML-схеми (як-от імена елементів, атрибутів та типів).

Застереження: На даний момент це нова та експериментальна функція. Є певні відомі обмеження та відсутні функції . Але я очікую, що це проявиться і дозріє дуже швидко.

Посилання:


JsonSchema помер. Будь-які плани щодо підтримки openAPI?
Лонзак,

5
@Lonzak Поки що планів немає. Але з першого погляду на специфікацію OpenAPI, чи не відповідають schemaчастини специфікації схеми JSON?
lexicore

це не працює, наприклад, з Java 12
codeKiller

8

Схема JSON не має на меті еквівалент функції XML Schema. В одному є особливості, але в іншому немає.

Загалом ви можете створити зіставлення з XML у JSON і назад, але це не так для схеми XML та схеми JSON.

Тим не менш, якщо ви зіставили XML-файл із JSON, цілком можливо створити схему JSON, яка перевіряє цей JSON майже так само, як XSD перевіряє XML. Але це не пряме відображення. І неможливо гарантувати, що він перевірить JSON точно так само, як XSD перевіряє XML.

З цієї причини, якщо ці дві специфікації не зроблені на 100% сумісними з функціями, для перенесення системи перевірки із XML / XSD на схему JSON / JSON буде потрібно втручання людини.


Я цього не розумію. Ви можете навести приклад?
Феніл

4
Скажімо, у вас є щось на зразок <man name = "Fred"> <dog name = "Rex"> </dog> </man> Ви можете визначити відображення для представлення сутності в Json, наприклад: {"type": "людина", ім'я: 'Фред', домашні тварини: [{тип: 'собака', ім'я: 'Рекс'}]} Але немає гарантії, що ви можете створити відображення XSD до схеми Json, що відповідає тому самому набору документи
Ерік Хартфорд

6

Застереження: Я автор jgeXml.

jgexml має утиліту на основі Node.js, xsd2jsonяка здійснює перетворення між XML-схемою (XSD) та файлом JSON-схеми.

Як і у випадку з іншими параметрами, це не перетворення 1: 1, і, можливо, вам доведеться вручну відредагувати висновок, щоб покращити перевірку схеми JSON, але він був використаний для представлення складної XML-схеми всередині визначення OpenAPI (swagger).

Зразок purchaseorder.xsd, наведений в іншій відповіді, відображається як:

"PurchaseOrderType": {
  "type": "object",
  "properties": {
    "shipTo": {
      "$ref": "#/definitions/USAddress"
    },
    "billTo": {
      "$ref": "#/definitions/USAddress"
    },
    "comment": {
      "$ref": "#/definitions/comment"
    },
    "items": {
      "$ref": "#/definitions/Items"
    },
    "orderDate": {
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}.*$"
    }
  },

Я встановив його за допомогою npm install -g jgexml. Тоді xsd2jsjonне було на шляху. Я спробував node C:\Users\Oliver\AppData\Roaming\npm\node_modules\jgexml\xsd2json.js. Це, однак, щойно повернулось. Чи існує утиліта командного рядка?
koppor

Це не інтуїтивно названо, але є приклад CLItestxsd2j.js
MikeRalphson

На жаль, це не працює, з'являється помилка TypeError: Не вдається встановити властивість 'AdditionalProperties' для null. (заради прикладу Jsonix прекрасно працював з тим самим файлом)
D.Dimitrioglo

Будь ласка, підніміть проблему з github, якщо ви можете поділитися вхідними даними.
MikeRalphson

0

Скопіюйте свою XML-схему сюди та отримайте код схеми JSON до онлайн-інструментів , доступних для створення схеми JSON із XML-схеми.


Я бачу, що він може генерувати XSD із XML, але я все одно не бачу, щоб генерувати JSON-схему.
NealWalters

-4

Правда, але після перетворення json на xml за допомогою xmlspy, ви можете використовувати програму trang (http://www.thaiopensource.com/relaxng/trang.html) для створення xsd із файлів xml.


8
але це йде в неправильному напрямку
vipw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.