从XML模式(XSD)生成Json模式


78

有人知道如何从现有的XML模式(XSD文件)生成JSON模式吗?有没有可用的工具?


4
我认为真正的问题是:“是否可以在JSON模式和XML模式之间建立映射?” 不是题外话。也许这个问题可以改写。
埃里克·哈特福德

1
Falco Nogatz在2013年获得了理学学士学位论文,产生了xsd2json
supervacuo 2014年

一种方法是从XSD到Java类,再从Java类到JSON模式。有关详细信息,请访问dzone.com/articles/generating-json-schema-xsd
koppor

Answers:


40

免责声明:我是Jsonix的作者,Jsonix是一个功能强大的开源XML <-> JSON JavaScript映射库。

今天,我发布了具有新JSON Schema生成功能的Jsonix Schema Compiler的新版本。

让我们以采购订单模式为例。这是一个片段:

  <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 Schema

结果如下所示(为简洁起见编辑):

{
    "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 Schema验证JSON。它还包含来自原始XML模式的所有必需元数据(例如元素,属性和类型名称)。

免责声明:目前,这是一个新的实验性功能。存在某些已知限制和功能缺失。但我希望这会很快显现并成熟。

链接:


JsonSchema已死。有计划支持openAPI吗?
龙萨克

5
@Lonzak到目前为止没有计划。但是,乍一看,OpenAPI规范中的schema部分内容是否遵循JSON Schema规范?
lexicore

例如,这不适用于Java 12
codeKiller

8

JSON Schema不应与XML Schema等效。其中一个具有功能,而另一不具有。

通常,您可以创建从XML到JSON的映射,然后再返回,但是对于XML模式和JSON模式则不是这种情况。

就是说,如果您已将XML文件映射到JSON,则很有可能设计出一种JSON模式,以与XSD验证XML几乎相同的方式来验证JSON。但这不是直接映射。并且不可能保证它将与XSD验证XML完全相同地验证JSON。

因此,除非使两个规范100%兼容,否则将验证系统从XML / XSD迁移到JSON / JSON Schema将需要人工干预。


我不明白 你能举个例子吗?
菲尼尔2016年

3
假设您有类似<man name =“ Fred”> <dog name =“ Rex”> </ dog> </ man>之类的东西。您可以定义一个映射来表示Json中的实体,例如:{“ type”: “ man”,名称:“ Fred”,宠物:[{type:'dog',名称:'Rex'}]}但是,不能保证您可以构建XSD到Json Schema的映射,该映射与相同的文件
Eric Hartford

6

免责声明:我是jgeXml的作者。

jgexml具有基于Node.js的实用程序xsd2json,可在XML模式(XSD)和JSON模式文件之间进行转换。

与其他选项一样,它不是1:1转换,您可能需要手动编辑输出以改进JSON模式验证,但是它已被用来表示OpenAPI(swagger)定义内的复杂XML模式。

在另一个答案中给出的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


-4

的确如此,但是使用xmlspy将json转换为xml之后,您可以使用trang应用程序(http://www.thaiopensource.com/relaxng/trang.html)从xml文件创建xsd。


8
但是这会在错误的方向
用vipw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.