我正在编写一些具有共享属性的对象的JSON模式。
在JSON架构1中:
...
"properties": {
"someProperty": {
"type": "object",
"required": [
"propertyA",
"propertyB",
"propertyC",
],
"additionalProperties": false,
"properties": {
"propertyA": {
"type": "integer"
},
"propertyB": {
"type": "integer"
},
"propertyC": {
"type": "integer"
}
}
}
}
...
在JSON架构2中:
...
"properties": {
"someProperty": {
"type": "object",
"required": [
"propertyD",
"propertyB",
"propertyC",
],
"additionalProperties": false,
"properties": {
"propertyD": {
"type": "integer"
},
"propertyB": {
"type": "integer"
},
"propertyC": {
"type": "integer"
}
}
}
}
...
因此,这两个对象(someProperty
)之间的唯一区别是propertyA
与propertyD
。
因此,我决定制作一个通用的JSON模式,其中包含这两个共享属性propertyB
和propertyC
的定义。
一种解决方案是在公共模式中定义一个包含这两个属性的对象,但我希望我的JSON在同一级别上具有这三个属性(平坦,未包装),并且不是< / strong>像这样:
"someProperty": {
"propertyA": 2,
"sharedObject": {
"propertyB": 3,
"propertyC": 4
}
}
我想要的是什么?我想最终得到一些能使我的JSON有效的东西:
"someProperty": {
"propertyA": 2,
"propertyB": 3,
"propertyC": 4
}
和
"someProperty": {
"propertyD": 2,
"propertyB": 3,
"propertyC": 4
}
将所有这些属性设为required
且不允许additionalProperties
。
答案 0 :(得分:0)
您可以使用oneOf
实现此目的。 oneOf
是一个异或的声明。 &#34; propertyA&#34;中的一个或另一个或&#34; propertyD&#34;而不是两者都可以在同一时间出现。
{
"type": "object",
"properties": {
"someProperty": {
"type": "object",
"properties": {
"propertyA": {
"type": "integer"
},
"propertyB": {
"type": "integer"
},
"propertyC": {
"type": "integer"
},
"propertyD": {
"type": "integer"
}
},
"required": ["propertyB", "propertyC"],
"oneOf": [
{ "required": ["propertyA"] },
{ "required": ["propertyD"] }
],
"additionalProperties": false
}
}
}