有没有一种方法在嵌套的JSON Schema中实现与Postgres CHECK约束等效的功能?假设我们有两个属性的数据,每个属性都有嵌套属性。如何使第一个对象的必需内容取决于第二个对象?
我的真实案例是为GeoJSON对象构建JSON模式,该对象具有几何对象(即点或多边形,或null),以及“属性”对象中的其他属性。我希望根据几何类型更改所需的属性。
我尝试了以下两种解决方案,但均失败了:
这也将被验证,因为使用几何图形时不再需要属性/位置: "最初的回答"
我的真实案例是为GeoJSON对象构建JSON模式,该对象具有几何对象(即点或多边形,或null),以及“属性”对象中的其他属性。我希望根据几何类型更改所需的属性。
我尝试了以下两种解决方案,但均失败了:
- 将“allOf”嵌套在“anyOf”中以涵盖所有可能性
- 复制“definitions”,以具有没有几何形状的属性_no_geom、几何_no_geom、具有几何形状的属性_with_geom和几何_with_geom,并在“anyOf”中声明它们
{
"attributes": {
"name": "Person2",
"place": "City2"
},
"geometry": null
}
这也将被验证,因为使用几何图形时不再需要属性/位置: "最初的回答"
{
"attributes": {
"name": "Person1"
},
"geometry": {
"type": "Point",
"coordinates": []
}
}
编辑
在Relequestual的回答基础上,这是我得到的不令人满意的结果:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"geometryIsPoint": {
"type": "object",
"required": ["type"],
"properties": {
"type": {
"const": "Point"
}
}
},
"partialAttributes": {
"type": "object",
"required": ["name"],
"properties": {
"name": {
"type": "string"
},
"place": {
"type": "string"
}
}
},
"fullAttributes": {
"type": "object",
"required": ["name", "place"],
"properties": {
"name": {
"type": "string"
},
"place": {
"type": "string"
}
}
},
"conditionalAttributes": {
"allOf": [
{
"if": {
"$ref": "#/definitions/geometryIsPoint"
},
"then": {
"$ref": "#/definitions/partialAttributes"
},
"else": {
"$ref": "#/definitions/fullAttributes"
}
}
]
}
},
"properties": {
"attributes": {
"$ref": "#/definitions/conditionalAttributes"
},
"geometry": {
"$ref": "#/definitions/geometryIsPoint"
}
}
}
如果移除attributes/place
属性,此架构将无法验证以下内容。
最初的回答:
如果删除attributes/place
属性,则此模式将无法验证以下内容。
{
"attributes": {
"name": "Person",
"place": "INVALID IF THIS LINE IS REMOVED ;-("
},
"geometry": {
"type": "Point",
"coordinates": {}
}
}
如果geometry/type存在,则要求在attributes中有某些内容
? - undefined