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

82

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


5
我认为真正的问题,“是否可能在JSON模式和XML模式之间进行映射?”并不是离题的。也许这个问题可以重新表述。 - Eric Hartford
2
Falco Nogatz在2013年完成了学士论文,结果产生了xsd2json - supervacuo
一种方法是从XSD转换为Java类,再从Java类转换为JSON模式。详情请参见https://dzone.com/articles/generating-json-schema-xsd。 - koppor
5个回答

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

今天,我发布了新版本的Jsonix Schema Compiler,其中包含新的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 Schema 是从原始的 XML Schema 派生而来的。它不是完全的 1:1 转换,但非常接近。

生成的 JSON Schema 与生成的 Jsonix 映射匹配。因此,如果您使用 Jsonix 进行 XML<->JSON 转换,您应该能够使用生成的 JSON Schema 验证 JSON。它还包含了来自原始 XML Schema 的所有必需元数据(如元素、属性和类型名称)。

免责声明:目前这是一个新的实验性功能。存在某些已知的 限制和缺失的功能。但我预计这将非常快地展现和成熟。

链接:


JsonSchema已经过时了。有计划支持openAPI吗? - Lonzak
7
@Lonzak 目前还没有计划。但是从第一眼看 OpenAPI 规范,schema 部分不是遵循 JSON Schema 规范吗? - lexicore
1
这个不起作用,例如,Java 12。 - codeKiller
@Lonzak JSON Schema被OpenAPI用来描述JSON内容的形状。 - Eric Hartford
@EricHartford 好久不见 :-) 你是对的。OpenAPI正在使用较旧的JSON模式草案,该草案仍处于草案阶段(2022年)。 - Lonzak
我遇到了这个错误:Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource,我的操作系统是ubuntu20.04,Java版本是11.0.17,我的安装步骤是:1. sudo apt install default-jre 2. npm install jsonix-schema-compiler 下载了purchaseorder.xsd文件。运行命令为:java -jar ./node_modules/jsonix-schema-compiler/lib/jsonix-schema-compiler-full.jar -generateJsonSchema -p PO purchaseorder.xsd - akpp

11

JSON Schema并非旨在与XML Schema的功能等效。两者之间有各自独有的功能。

一般而言,你可以创建一个从XML到JSON的映射,然后再进行反向映射,但是对于XML schema和JSON schema并非如此。

话虽如此,如果你已经将XML文件映射到JSON,则很可能可以设计一个JSON Schema,以几乎相同的方式验证JSON,就像XSD验证XML一样。但这不是直接的映射,并且不能保证它将完全与XSD验证XML相同地验证JSON。

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


我不理解这个。你能举个例子吗? - Fenil Dedhia
5
假设你有以下这样的内容:<man name="Fred"><dog name="Rex"></dog></man>你可以定义一个映射来表示Json实体,例如:{"type": "man", name: 'Fred', pets: [{type: 'dog', name: 'Rex'}]}但是,并不能保证你能构建一个XSD到Json模式的映射,以匹配相同的文档集合。 - Eric Hartford

8
免责声明:我是jgeXml的作者。 jgexml有一个基于Node.js的实用程序xsd2json,可以在XML模式(XSD)和JSON模式文件之间进行转换。
与其他选项一样,这不是一对一的转换,您可能需要手动编辑输出以改进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
它的命名不是很直观,但在testxsd2j.js中有一个CLI示例。 - MikeRalphson
很不幸,它无法工作,出现了 TypeError 错误:无法将 null 的属性 'additionalProperties' 设置为某个值。(举个例子,Jsonix 使用相同的文件可以正常工作) - D.Dimitrioglo
如果您可以分享输入,请在 GitHub 上提出问题。 - MikeRalphson

-2

将您的XML模式复制到在线工具中,获取可从XML模式生成JSON模式的代码。


我发现它可以从XML生成XSD,但我没有看到任何生成JSON-Schema的方法。 - NealWalters

-5

没错,但是在使用xmlspy将json转换为xml之后,你可以使用trang应用程序(http://www.thaiopensource.com/relaxng/trang.html)从xml文件中创建xsd。


8
但那个方向是错误的。 - vipw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接