将 xs:choice 表示为 JSON 架构

Represent xs:choice as JSON schema

正在思考 JSON 架构的 oneOf

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

我有一个 XML 架构概念,您可以在其中为某些实体指定名称或 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架构的异同以供参考?

我自己没试过,但我想你需要这样的东西:

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

所以在顶层之后 "allOf" 你首先描述基本结构,然后用 "oneOf" 你表达选择。

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

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

这在 XML 模式和 JSON 模式中变得明显,尤其是在您的示例中。 XML 模式,xs:choice,提供可能的元素(XML 信息集数据模型中的节点)之间的选择,并且由于这些元素带有它们的名称(节点上的标签),您还可以选择这些元素名称及其布局。

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