2010-10-13 136 views
47

有谁知道如何从现有的XML模式(XSD文件)生成JSON schema? 是否有任何工具可用于此?从XML模式生成Json模式(XSD)

+1

我认为真正的问题是“是否可以在JSON模式和XML模式之间进行映射?”不是无关紧要的。也许这个问题可能会被重写。 – 2014-08-15 19:34:39

+0

Falco Nogatz在2013年做了一篇BSc论文,导致了[xsd2json](https://github.com/fnogatz/xsd2json)。 – supervacuo 2014-11-04 18:01:09

回答

10

最初问这个问题一年后,JSON Schema仍然是IETF草案文档。截至撰写本文时(2011年10月18日),工作组正试图就规范草案4达成一致。虽然有几个推测性验证实现(请参阅http://json-schema.org/),但大多数工具供应商并未投入太多精力实施JSON模式开发,编辑或转换工具。

+3

最新的IETF草案文件于2013年8月到期,似乎没有人再追求这一努力。 – 2014-03-28 23:17:53

+0

我认为这是旧的,但即使在历史背景下,这也不能回答所问的问题。 – vossad01 2017-08-25 16:37:45

-3

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

+5

但这是错误的方向 – vipw 2012-10-05 09:39:55

6

JSON Schema不打算与XML Schema等同使用。有一个功能,但没有在其他功能。

一般来说,您可以创建一个从XML到JSON的映射,然后再返回,但XML模式和JSON模式并非如此。这就是说,如果你已经将XML文件映射到JSON,那么很可能制作一个JSON Schema来验证JSON,几乎和XSD验证XML一样。但它不是一个直接映射。而且不可能保证它将验证JSON与XSD验证XML完全相同。由于这个原因,除非这两个规范是100%兼容的特性,否则将验证系统从XML/XSD迁移到JSON/JSON Schema需要人工干预。

+0

我不明白这一点。你能举个例子吗? – Fenil 2016-07-07 14:18:02

+2

比方说,你有什么样 <男人的名字=“弗雷德”><狗的名字=“雷克斯”> 您可以定义的映射来表示JSON中的实体,例如: {“类型” :“man”,name:'Fred',pets:[{type:'dog',name:'Rex'}]} 但是,不能保证您可以构建XSD到Json Schema的映射,同一套文件 – 2016-07-08 02:14:13

25

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

今天我发布了Jsonix Schema Compiler的新版本,其中新增了JSON Schema generation功能。

让我们以Purchase Order架构为例。这里有一个片段:

<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 mappings为好matching 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 Schema的。这不完全是1:1的转变,但非常接近。

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

声明:目前这是一个新的实验性功能。有一定知道limitations and missing functionality。但是我期待这种体现和成熟非常快。

链接:

2

免责声明:我jgeXml的作者。

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

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

"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}.*$" 
    } 
    }, 
0

复制XML模式在这里&得到JSON模式代码到online tools其可用于生成XML模式JSON模式:

在另一个答案给出的purchaseorder.xsd的样品呈现。