将 xsd 转换为 json 架构(Jsonix、XMLSpy)
Convert xsd to json schema (Jsonix, XMLSpy)
我正在尝试将 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"
}
谢谢
我是 Jsonix 的作者。
您发布的 Jsonix 输出不是 JSON 架构,它是 Jsonix mappings for your schema. If you want to generate JSON Schema, add the -generateJsonSchema
parameter. See 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"
}
}
]
}
我正在尝试将 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"
}
谢谢
我是 Jsonix 的作者。
您发布的 Jsonix 输出不是 JSON 架构,它是 Jsonix mappings for your schema. If you want to generate JSON Schema, add the -generateJsonSchema
parameter. See 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"
}
}
]
}