从 Liquid Studio 将 xsd 转换为 json 模式后,非必填字段被设置为必填

问题描述 投票:0回答:1

属性“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 架构显示它们是必需的。

liquid-xml
1个回答
0
投票

如果您有一个如下所示的 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
属性。

当有更新时我会更新线程。

© www.soinside.com 2019 - 2024. All rights reserved.