将 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:choice
到 oneOf
的映射并不像看起来那么简单,它需要找到不太明显的解决方法。
正在思考 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:choice
到 oneOf
的映射并不像看起来那么简单,它需要找到不太明显的解决方法。