web-dev-qa-db-ja.com

XMLスキーマ(XSD)からJSONスキーマを生成する

既存のXMLスキーマ(XSDファイル)から JSONスキーマ を生成する方法を知っている人はいますか?これに使用できるツールはありますか?

69
JB Hurteaux

免責事項:私は 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マッピング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スキーマから派生しています。厳密に1:1の変換ではありませんが、非常に近い変換です。

生成されたJSONスキーマは、生成されたJsonixマッピングと一致します。したがって、XML <-> JSON変換にJsonixを使用する場合、生成されたJSONスキーマでJSONを検証できるはずです。また、元のXMLスキーマからのすべての必要なメタデータ(要素、属性、型名など)も含まれています。

免責事項:現時点では、これは新しい実験的な機能です。特定の既知の 制限および欠落している機能 があります。しかし、私はこれが非常に早く現れて成熟することを期待しています。

リンク:

33
lexicore

この質問が最初に尋ねられた1年後、JSONスキーマはIETFドラフト文書のままです。この執筆時点(2011年10月18日)で、ワーキンググループは仕様のドラフト4について合意を得ようとしています。投機的な検証の実装はいくつかありますが( http://json-schema.org/ を参照)、ほとんどのツールベンダーはJSONスキーマの開発、編集、または変換を実装するツールに多くの労力を費やしていません。

10
J Edward Ellis

JSONスキーマは、XMLスキーマと同等の機能を意図したものではありません。一方には機能がありますが、もう一方には機能がありません。

一般に、XMLからJSONへのマッピングを作成し、再度作成することができますが、XMLスキーマとJSONスキーマの場合はそうではありません。

ただし、XMLファイルをJSONにマップした場合、XSDがXMLを検証するのとほぼ同じ方法でそのJSONを検証するJSONスキーマを作成することは非常に可能です。しかし、それは直接的なマッピングではありません。また、XSDがXMLを検証するのとまったく同じJSONを検証することを保証することはできません。

このため、2つの仕様が100%機能互換性を持たない限り、検証システムをXML/XSDからJSON/JSONスキーマに移行するには人間の介入が必要です。

7
Eric Hartford

免責事項:私は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}.*$"
    }
  },
4
MikeRalphson

ここにXMLスキーマをコピーし、JSONスキーマコードを オンラインツール に取得します。これは、XMLスキーマからJSONスキーマを生成するために使用できます。

0
Karl Parker