如何在XSD中表示json数组

时间:2015-03-18 06:44:30

标签: arrays xml json xsd

我有以下json,它如何在XSD中表示。它是一个json元组,我在XSD中找不到有效的构造来表示这种类型的json结构。

{
"type": "array",
"items": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "string",
"enum": ["Street", "Avenue", "Boulevard"]
},
{
"type": "string",
"enum": ["NW", "NE", "SW", "SE"]
}
]
}

1 个答案:

答案 0 :(得分:2)

如果您要为您的问题提供更多背景信息,这将有助于其他人。首先,您的示例来自Understanding JSON Schema指南的第30页(打印版本)。您的JSON是JSON模式(草案#4)。

因为你在谈论模式,所以我把你的问题看作模型。为了更清楚,我认为你的问题类似于许多年前提出的问题:可以使用UML来表示XSD结构吗?

我实际上使用XSD来描述JSON结构;我们在XSD和JSON模式之间进行了自动转换(草案#4),因为我自己使用XSD作为数据建模语言。

您的特定示例没有自然的XSD等效项。从本质上讲,我的意思是XML也是有意义的,而“通用”的XML-to-JSON转换会产生预期的结果。

如果我们拿走简单的东西,例如建模为列表的简单类型:

<xsd:simpleType name="array">
    <xsd:list itemType="xsd:float"/>
</xsd:simpleType>

基本上与(逗号分隔符除外)相同:

{
    "type": "array",
    "items": {
        "type": "number"
    }
}

那么我的答案实际上是关于一个“配置文件”,转换工具将使用该配置文件来获取XSD中表示的模型的语义(换句话说,我们不会在这里挂起XML文档),使用JSON模式表示相同。

我们的XSD-to-JSON架构配置文件使用复杂类型来表示对象和数组。当应用于复杂类型的“构造型”是“数组”时,以下模型与您的JSON模式完全匹配。

<xsd:complexType name="address">
    <xsd:annotation>
        <xsd:appinfo>
            <xsd2json:type>array</xsd2json:type>
        </xsd:appinfo>
    </xsd:annotation>
    <xsd:sequence>
        <xsd:element name="StreetNumber" type="xsd:float"/>
        <xsd:element name="StreetName" type="xsd:string"/>
        <xsd:element name="StreetType">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="Street"/>
                    <xsd:enumeration value="Avenue"/>
                    <xsd:enumeration value="Boulevard"/>                        
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
        <xsd:element name="StreetDirection">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="NW"/>
                    <xsd:enumeration value="NE"/>
                    <xsd:enumeration value="SW"/>
                    <xsd:enumeration value="SE"/>                       
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>