Json 架构 - 如何使任意两个或更多属性成为必需
Json Schema - How to make anyOf two or more properties required
我有这个父架构:
{
"definitions": {
"parcel": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"accountNumber": {
"type": "string"
},
"parcelNumber": {
"type": "string"
},
"propertyType": {
"type": "string"
},
"address": {
"$ref": "address.json#/definitions/address"
},
"coordinates": {
"$ref": "coordinates.json#/definitions/coordinates"
}
},
"required": ["accountNumber", "parcelNumber"]
}
}
}
以下是引用的子模式:
{
"definitions": {
"address": {
"type": "object",
"properties": {
"addressString": {
"type": "string",
"addressType": {
"enum": ["residential", "business"]
}
},
"required": ["addressString"]
}
}
}
}
{
"definitions": {
"coordinates": {
"type": "object",
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
},
"projection": {
"type": "string"
}
},
"required": ["latitude ", "longitude", " projection"]
}
}
}
我想将以下条件应用于父架构。
- 提供地址或坐标或两者都提供。
- 如果没有提供地址和坐标,则验证失败。
这就是我实现解决方案的方式。
"anyOf": [{
"required": ["accountNumber", "parcelNumber", "coordinates"]
}, {
"required": ["accountNumber", "parcelNumber", "address"]
}]
您的 anyOf
解决方案有效。您可以通过将固定的必需属性(accountNumber 和 parcelNumber)从 anyOf
属性 组中分离出来使其更清晰一些:
{
"type": "object",
"required": [
"accountNumber",
"parcelNumber"
],
"anyOf": [
{"required" : ["address"]},
{"required" : ["coordinates"]}
],
"properties": {
"id": {
"type": "string"
},
"accountNumber": {
"type": "string"
},
"parcelNumber": {
"type": "string"
},
"propertyType": {
"type": "string"
},
"address": {
"type": "object",
"properties": {
"addressString": {
"type": "string"
},
"addressType": {
"enum": [
"residential",
"business"
]
}
},
"required": [
"addressString"
]
},
"coordinates": {
"type": "object",
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
},
"projection": {
"type": "string"
}
},
"required": [
"latitude",
"longitude",
"projection"
]
}
}
}
这里有一个要点供参考:
http://jsonschemalint.com/#/version/draft-05/markup/json?gist=f36d9a7e080c4d25dbbf09b7dd03137e
我有这个父架构:
{
"definitions": {
"parcel": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"accountNumber": {
"type": "string"
},
"parcelNumber": {
"type": "string"
},
"propertyType": {
"type": "string"
},
"address": {
"$ref": "address.json#/definitions/address"
},
"coordinates": {
"$ref": "coordinates.json#/definitions/coordinates"
}
},
"required": ["accountNumber", "parcelNumber"]
}
}
}
以下是引用的子模式:
{
"definitions": {
"address": {
"type": "object",
"properties": {
"addressString": {
"type": "string",
"addressType": {
"enum": ["residential", "business"]
}
},
"required": ["addressString"]
}
}
}
}
{
"definitions": {
"coordinates": {
"type": "object",
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
},
"projection": {
"type": "string"
}
},
"required": ["latitude ", "longitude", " projection"]
}
}
}
我想将以下条件应用于父架构。
- 提供地址或坐标或两者都提供。
- 如果没有提供地址和坐标,则验证失败。
这就是我实现解决方案的方式。
"anyOf": [{
"required": ["accountNumber", "parcelNumber", "coordinates"]
}, {
"required": ["accountNumber", "parcelNumber", "address"]
}]
您的 anyOf
解决方案有效。您可以通过将固定的必需属性(accountNumber 和 parcelNumber)从 anyOf
属性 组中分离出来使其更清晰一些:
{
"type": "object",
"required": [
"accountNumber",
"parcelNumber"
],
"anyOf": [
{"required" : ["address"]},
{"required" : ["coordinates"]}
],
"properties": {
"id": {
"type": "string"
},
"accountNumber": {
"type": "string"
},
"parcelNumber": {
"type": "string"
},
"propertyType": {
"type": "string"
},
"address": {
"type": "object",
"properties": {
"addressString": {
"type": "string"
},
"addressType": {
"enum": [
"residential",
"business"
]
}
},
"required": [
"addressString"
]
},
"coordinates": {
"type": "object",
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
},
"projection": {
"type": "string"
}
},
"required": [
"latitude",
"longitude",
"projection"
]
}
}
}
这里有一个要点供参考:
http://jsonschemalint.com/#/version/draft-05/markup/json?gist=f36d9a7e080c4d25dbbf09b7dd03137e