围绕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模式之间的相似之处和差异以供参考?
答案 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:choice
到oneOf
的映射并不像看起来那么简单,而且需要找到不太明显的解决方法。