将xs:choice表示为JSON模式

时间:2017-01-09 10:20:52

标签: json xml xsd jsonschema choice

围绕JSON Schema的oneOf

我想生成一个XML格式的JSON版本,并使用JSON模式验证基本方面(我知道会有一些差异)。

我有一个XML Schema概念,您可以在其中为某个实体指定名称或ID:

<xs:element name="Entity" type="test:EntityType" />
    <xs:complexType name="EntityType">
        <xs:choice>
            <xs:element name="EntityID" />
            <xs:element name="EntityName" />
        </xs:choice>
    </xs:complexType>

在相应的JSON架构中,我遇到了放置oneOf对象的位置的问题。

the JSON schema examples中,您应该将完整的架构放入oneOf,是吗?在一般情况下,这应该怎么样?有没有人记录XSD和JSON模式之间的相似之处和差异以供参考?

2 个答案:

答案 0 :(得分:4)

我自己没有尝试过,但我认为你需要这样的东西:

{
    "allOf" : [
        {
            "type" : "object",
            "properties" : {
                "entityName" : {"type" : "string"},
                "entityID" : {"type" : "integer"}
            }
        },
        {
            "oneOf" : [
                {
                    "required" : ["entityName"]
                },
                {
                    "required" : ["entityID"]
                }
            ]
        }
    ]
}

因此,在顶级"allOf"之后,您首先要描述基本结构,然后使用"oneOf"来表达选择。

答案 1 :(得分:2)

我认为您面临的问题是XML和JSON数据模型之间的阻抗不匹配。

虽然两者都基于树,但XML元素或JSON键的标签不会放在树中的相同位置:从逻辑角度来看,XML元素名称放在节点上树的结构,而JSON键放在树的上。

这在XML Schema和JSON Schema中变得非常明显,特别是对于您的示例。使用xs:choice的XML模式提供了可能的元素(XML信息集数据模型中的节点)之间的选择,并且由于这些元素带有它们的名称(节点上的标签),因此您可以选择这些元素名称作为以及他们的布局。

但是,在JSON Schema中,oneOf构造允许选择对象布局,但包括选择名称(边缘上的标签)。换句话说,密钥(EntityID或EntityName)指定为oneOf构造的外部。这意味着xs:choiceoneOf的映射并不像看起来那么简单,而且需要找到不太明显的解决方法。