属性“minOccur”设置为 0 的 Xsd 元素本应是非必填字段,但在从 xsd 转换为 json 模式后被设置为必填字段。
情况是这样的:
XSD:
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio (https://www.liquid-technologies.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element id="T01" name="Test">
<xs:complexType>
<xs:sequence>
<xs:element id="T02" name="Form" maxOccurs="40">
<xs:complexType>
<xs:sequence>
<xs:element id="T03" name="Numbers" minOccurs="0" maxOccurs="500">
<xs:complexType>
<xs:sequence>
<xs:element id="N01" name="Attr1" minOccurs="0" />
<xs:element id="N02" name="Attr2" minOccurs="0" />
<xs:element id="N03" name="Attr3" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element id="T04" name="List">
<xs:complexType>
<xs:sequence>
<xs:element name="Attr1" id="L01"/>
<xs:element name="Attr2" id="L02"/>
<xs:element name="Attr3" id="L03" minOccurs="0" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
从 Liquid Studio 输出 JSON 模式:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Test": {
"$ref": "#/$defs/Test"
}
},
"additionalProperties": false,
"required": [
"Test"
],
"$defs": {
"Test": {
"type": "object",
"properties": {
"Form": {
"type": "array",
"maxItems": 40,
"minItems": 1,
"items": {
"type": "object",
"properties": {
"Numbers": {
"type": "array",
"maxItems": 500,
"items": {
"type": "object",
"properties": {
"Attr1": {
"type": "object",
"additionalProperties": false
},
"Attr2": {
"type": "object",
"additionalProperties": false
},
"Attr3": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}
},
"List": {
"type": "object",
"properties": {
"Attr1": {
"type": "object",
"additionalProperties": false
},
"Attr2": {
"type": "object",
"additionalProperties": false
},
"Attr3": {
"type": "array",
"maxItems": 2,
"items": {
"type": "object",
"additionalProperties": false
}
}
},
"additionalProperties": false,
"required": [
"Attr1",
"Attr2",
"Attr3"
]
}
},
"additionalProperties": false,
"required": [
"Numbers",
"List"
]
}
}
},
"additionalProperties": false,
"required": [
"Form"
]
}
}
}
元素
Test.Numbers
和 Test.List.Attr3
不应是必需的,因为它们的“minOccurs”= 0,但输出 json 架构显示它们是必需的。
如果您有一个如下所示的 XSD 架构
<xs:element name="Thing" minOccurs="0" maxOccurs="2"/>
它将验证如下所示的 XML 数据
<Parent>
<Thing>1</Thing>
<Thing>2</Thing>
</Parent>
等效的 JSON 文档如下所示
{ "Thing" : [1, 2] }
但是,如果 XML 数据不包含任何
Thing
,即
<Parent></Parent>
等效的 JSON 可能如下所示
{ "Thing" : [] }
或者像这样
{ }
两者都是有效的,都传达了源 XML 结构中不存在的微妙不同的含义。目前,我们通过强制
Thing
属性为 required
来进行转换,如果没有项目,它包含一个空数组。
考虑到这一点,我们将添加一个选项,以便选择是否将数组视为 JSON 模式中的
required
属性。
当有更新时我会更新线程。