【问题标题】:Convert xsd to json schema (Jsonix, XMLSpy)将 xsd 转换为 json 模式(Jsonix、XMLSpy)
【发布时间】:2016-11-27 18:02:07
【问题描述】:

我正在尝试将 xml 架构转换为 json 架构。

由于某种原因,我得到的 json 模式很奇怪,而且不正确。我使用 Jsonix 和 Altova XMLSpy 2017

例如,这是给定的 xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://jaxb.vo.dozer.org/Employee" xmlns:tns="http://jaxb.vo.dozer.org/Employee">
  <complexType name="EmployeeType">
    <sequence>
      <element name="FirstName" type="string" minOccurs="1" maxOccurs="1"></element>
      <element name="BirthDate" type="date" minOccurs="0" maxOccurs="1"></element>
      <element name="LastName" type="string" minOccurs="1" maxOccurs="1"></element>
    </sequence>
  </complexType>

  <element name="Employee" type="tns:EmployeeType"></element>
  <element name="EmployeeWithInnerClass">
    <complexType>
      <sequence>
        <element name="FirstName" type="string" minOccurs="1" maxOccurs="1"></element>
        <element name="BirthDate" type="date" minOccurs="0" maxOccurs="1"></element>
        <element name="LastName" type="string" minOccurs="1" maxOccurs="1"></element>
        <element name="Address">
          <complexType>
            <sequence>
              <element name="Street" type="string"></element>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>

这是我从 Jsonix 得到的 json 模式:

var org_dozer_vo_jaxb_employee_Module_Factory = function () {
  var org_dozer_vo_jaxb_employee = {
    name: 'org_dozer_vo_jaxb_employee',
    typeInfos: [{
        localName: 'EmployeeType',
        typeName: {
          namespaceURI: 'http:\/\/jaxb.vo.dozer.org\/Employee',
          localPart: 'EmployeeType'
        },
        propertyInfos: [{
            name: 'firstName',
            required: true,
            elementName: {
              localPart: 'FirstName'
            }
          }, {
            name: 'birthDate',
            elementName: {
              localPart: 'BirthDate'
            },
            typeInfo: 'Date'
          }, {
            name: 'lastName',
            required: true,
            elementName: {
              localPart: 'LastName'
            }
          }]
      }, {
        localName: 'EmployeeWithInnerClass.Address',
        typeName: null,
        propertyInfos: [{
            name: 'street',
            required: true,
            elementName: {
              localPart: 'Street'
            }
          }]
      }, {
        localName: 'EmployeeWithInnerClass',
        typeName: null,
        propertyInfos: [{
            name: 'firstName',
            required: true,
            elementName: {
              localPart: 'FirstName'
            }
          }, {
            name: 'birthDate',
            elementName: {
              localPart: 'BirthDate'
            },
            typeInfo: 'Date'
          }, {
            name: 'lastName',
            required: true,
            elementName: {
              localPart: 'LastName'
            }
          }, {
            name: 'address',
            required: true,
            elementName: {
              localPart: 'Address'
            },
            typeInfo: '.EmployeeWithInnerClass.Address'
          }]
      }],
    elementInfos: [{
        typeInfo: '.EmployeeWithInnerClass',
        elementName: {
          localPart: 'EmployeeWithInnerClass',
          namespaceURI: 'http:\/\/jaxb.vo.dozer.org\/Employee'
        }
      }, {
        typeInfo: '.EmployeeType',
        elementName: {
          localPart: 'Employee',
          namespaceURI: 'http:\/\/jaxb.vo.dozer.org\/Employee'
        }
      }]
  };
  return {
    org_dozer_vo_jaxb_employee: org_dozer_vo_jaxb_employee
  };
};
if (typeof define === 'function' && define.amd) {
  define([], org_dozer_vo_jaxb_employee_Module_Factory);
}
else {
  var org_dozer_vo_jaxb_employee_Module = org_dozer_vo_jaxb_employee_Module_Factory();
  if (typeof module !== 'undefined' && module.exports) {
    module.exports.org_dozer_vo_jaxb_employee = org_dozer_vo_jaxb_employee_Module.org_dozer_vo_jaxb_employee;
  }
  else {
    var org_dozer_vo_jaxb_employee = org_dozer_vo_jaxb_employee_Module.org_dozer_vo_jaxb_employee;
  }
}

为什么我有所有这些功能?我做了什么破事?

使用 Altova XMLSpy 的结果完全不同:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "additionalProperties": false,
    "definitions": {
        ".tns:Employee": {
            "$ref": "#/definitions/tns:EmployeeType"
        },
        ".tns:EmployeeWithInnerClass": {
            "additionalProperties": false,
            "patternProperties": {
                "^\\?\\w+$": {
                    "type": "string"
                }
            },
            "properties": {
                "Address": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "Street": {
                            "additionalProperties": false,
                            "patternProperties": {
                                "^\\?\\w+$": {
                                    "type": "string"
                                }
                            },
                            "properties": {
                                "$": {
                                    "$ref": "#/definitions/xs:string"
                                }
                            },
                            "type": "object"
                        }
                    },
                    "required": [
                        "Street"
                    ],
                    "type": "object"
                },
                "BirthDate": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "$": {
                            "$ref": "#/definitions/xs:date"
                        }
                    },
                    "type": "object"
                },
                "FirstName": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "$": {
                            "$ref": "#/definitions/xs:string"
                        }
                    },
                    "type": "object"
                },
                "LastName": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "$": {
                            "$ref": "#/definitions/xs:string"
                        }
                    },
                    "type": "object"
                }
            },
            "required": [
                "Address",
                "FirstName",
                "LastName"
            ],
            "type": "object"
        },
        "tns:EmployeeType": {
            "additionalProperties": false,
            "patternProperties": {
                "^\\?\\w+$": {
                    "type": "string"
                }
            },
            "properties": {
                "BirthDate": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "$": {
                            "$ref": "#/definitions/xs:date"
                        }
                    },
                    "type": "object"
                },
                "FirstName": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "$": {
                            "$ref": "#/definitions/xs:string"
                        }
                    },
                    "type": "object"
                },
                "LastName": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^\\?\\w+$": {
                            "type": "string"
                        }
                    },
                    "properties": {
                        "$": {
                            "$ref": "#/definitions/xs:string"
                        }
                    },
                    "type": "object"
                }
            },
            "required": [
                "FirstName",
                "LastName"
            ],
            "type": "object"
        },
        "xs:date": {
            "type": "string"
        },
        "xs:string": {
            "type": "string"
        }
    },
    "description": "JSON Schema generated by XMLSpy v2017 sp1 (x64) (http://www.altova.com)",
    "patternProperties": {
        "^\\?\\w+$": {
            "type": "string"
        }
    },
    "properties": {
        "@xmlns:tns": {
            "default": "http://jaxb.vo.dozer.org/Employee"
        },
        "@xmlns:xs": {
            "default": "http://www.w3.org/2001/XMLSchema"
        },
        "tns:Employee": {
            "$ref": "#/definitions/.tns:Employee"
        },
        "tns:EmployeeWithInnerClass": {
            "$ref": "#/definitions/.tns:EmployeeWithInnerClass"
        }
    },
    "type": "object"
}

谢谢

【问题讨论】:

    标签: json xml xsd jsonschema jsonix


    【解决方案1】:

    我是Jsonix的作者。

    您发布的 Jsonix 输出不是 JSON 架构,而是您的架构的 Jsonix mappings。如果要生成 JSON Schema,请添加 -generateJsonSchema 参数。见here

    以下是 Jsonix 将为您的架构生成的内容:

    {
        "id":"#",
        "definitions":{
            "EmployeeWithInnerClass":{
                "type":"object",
                "title":"EmployeeWithInnerClass",
                "required":[
                    "firstName",
                    "lastName",
                    "address"
                ],
                "properties":{
                    "firstName":{
                        "title":"firstName",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/string"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"FirstName",
                            "namespaceURI":""
                        }
                    },
                    "birthDate":{
                        "title":"birthDate",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/date"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"BirthDate",
                            "namespaceURI":""
                        }
                    },
                    "lastName":{
                        "title":"lastName",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/string"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"LastName",
                            "namespaceURI":""
                        }
                    },
                    "address":{
                        "title":"address",
                        "allOf":[
                            {
                                "$ref":"#/definitions/EmployeeWithInnerClass.Address"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"Address",
                            "namespaceURI":""
                        }
                    }
                },
                "typeType":"classInfo",
                "propertiesOrder":[
                    "firstName",
                    "birthDate",
                    "lastName",
                    "address"
                ]
            },
            "EmployeeWithInnerClass.Address":{
                "type":"object",
                "title":"EmployeeWithInnerClass.Address",
                "required":[
                    "street"
                ],
                "properties":{
                    "street":{
                        "title":"street",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/string"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"Street",
                            "namespaceURI":""
                        }
                    }
                },
                "typeType":"classInfo",
                "propertiesOrder":[
                    "street"
                ]
            },
            "EmployeeType":{
                "type":"object",
                "title":"EmployeeType",
                "required":[
                    "firstName",
                    "lastName"
                ],
                "properties":{
                    "firstName":{
                        "title":"firstName",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/string"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"FirstName",
                            "namespaceURI":""
                        }
                    },
                    "birthDate":{
                        "title":"birthDate",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/date"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"BirthDate",
                            "namespaceURI":""
                        }
                    },
                    "lastName":{
                        "title":"lastName",
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/string"
                            }
                        ],
                        "propertyType":"element",
                        "elementName":{
                            "localPart":"LastName",
                            "namespaceURI":""
                        }
                    }
                },
                "typeType":"classInfo",
                "typeName":{
                    "localPart":"EmployeeType",
                    "namespaceURI":"http://jaxb.vo.dozer.org/Employee"
                },
                "propertiesOrder":[
                    "firstName",
                    "birthDate",
                    "lastName"
                ]
            }
        },
        "anyOf":[
            {
                "type":"object",
                "properties":{
                    "name":{
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/QName"
                            },
                            {
                                "type":"object",
                                "properties":{
                                    "localPart":{
                                        "enum":[
                                            "Employee"
                                        ]
                                    },
                                    "namespaceURI":{
                                        "enum":[
                                            "http://jaxb.vo.dozer.org/Employee"
                                        ]
                                    }
                                }
                            }
                        ]
                    },
                    "value":{
                        "$ref":"#/definitions/EmployeeType"
                    }
                },
                "elementName":{
                    "localPart":"Employee",
                    "namespaceURI":"http://jaxb.vo.dozer.org/Employee"
                }
            },
            {
                "type":"object",
                "properties":{
                    "name":{
                        "allOf":[
                            {
                                "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/QName"
                            },
                            {
                                "type":"object",
                                "properties":{
                                    "localPart":{
                                        "enum":[
                                            "EmployeeWithInnerClass"
                                        ]
                                    },
                                    "namespaceURI":{
                                        "enum":[
                                            "http://jaxb.vo.dozer.org/Employee"
                                        ]
                                    }
                                }
                            }
                        ]
                    },
                    "value":{
                        "$ref":"#/definitions/EmployeeWithInnerClass"
                    }
                },
                "elementName":{
                    "localPart":"EmployeeWithInnerClass",
                    "namespaceURI":"http://jaxb.vo.dozer.org/Employee"
                }
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多