jsonSchema 来验证有条件的必需属性
jsonSchema to validate conditionally required attributes
我的 JSON 负载包含两个属性 home_number
、home_name
和 至少需要一个属性 。除此之外,这些属性还有以下附加限制。
home_number: type: string, Max length: 4
home_name: type: string, Max length: 50
JSON 如果两个属性都不满足要求,模式应该抛出错误。
例如:
有效JSON
{
"home_number": "1234", // valid
}
有效JSON
{
"home_number": null, // invalid
"home_name": "test_home_name" // valid
}
无效JSON
{
"home_number": "12345", // invalid
"home_name": null // invalid
}
我使用 if, then 关键字尝试了 draft-07
版本的以下 JSON 模式。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"address": {
"$ref": "#/definitions/address",
"properties": {
"house_number": {
"$ref": "#/definitions/address/house_number"
},
"house_name": {
"$ref": "#/definitions/address/house_name"
},
"post_code": {
"$ref": "#/definitions/address/postcode"
}
}
}
},
"required": [
"address"
],
"definitions": {
"address": {
"type": "object",
"properties": {
"postcode": {
"type": "string",
"maxLength": 6
}
},
"anyOf": [
{
"required": [
"house_number"
]
},
{
"required": [
"house_name"
]
}
],
"if": {
"properties": {
"house_name": {
"not": {
"type": "string",
"maxLength": 50
}
}
}
},
"then": {
"properties": {
"house_number": {
"type": "string",
"maxLength": 4
}
}
},
"required": [
"postcode"
]
}
}
}
我的问题是有没有 other/better 方法来实现这个
使用 draft-04
版本而不使用 draft-07
if then keywords?
正如评论中所指出的,这可能已被多次询问。
使用逻辑运算符可以解决以下问题、架构和 json 示例。我不能说它是否更好,它只是将 "anyOf" 内的任何内容分组(以及您可以在需要时添加的邮政编码的要求,并且您可以根据需要构建对完整 "properties" 内部的引用希望等)。或者您可以将其作为严格的 XOR "oneOf"(也如评论中所述)并确保每个案例的地址->属性定义都根据您的需要进行调整。
请阅读(链接到我自己过去的回答并不优雅,但可能会引导您进一步阅读):
针对您的问题(据我了解)的简化架构和示例:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties" : {
"address": {
"type" : "object",
"anyOf" : [
{
"properties" : {
"house_number" : {
"type":"string",
"maxLength": 4
},
},
"required":["house_number"]
},
{
properties : {
"house_name" : {
"type" : "string",
"maxLength" : 50
}
},
"required":["house_name"]
}
]
}
},
required: ["address"],
examples : [
{
baddress: {
}
},
{
address: {
"house_number":"1234",
"house_name" : null
}
},
{
address: {
"house_number":null,
"house_name" : null
}
},
{
address: {
"house_number":null,
"house_name" : "some name"
}
},
{
address: {
"house_number": "12345",
"house_name" : "some afafafasagagagffgfsagragsgasgasssssssfdgsdfgsdfgdsgsdfgsdgsdfgdfsgsdfgs name"
}
},
]
}
我的 JSON 负载包含两个属性 home_number
、home_name
和 至少需要一个属性 。除此之外,这些属性还有以下附加限制。
home_number: type: string, Max length: 4
home_name: type: string, Max length: 50
JSON 如果两个属性都不满足要求,模式应该抛出错误。
例如:
有效JSON
{
"home_number": "1234", // valid
}
有效JSON
{
"home_number": null, // invalid
"home_name": "test_home_name" // valid
}
无效JSON
{
"home_number": "12345", // invalid
"home_name": null // invalid
}
我使用 if, then 关键字尝试了 draft-07
版本的以下 JSON 模式。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"address": {
"$ref": "#/definitions/address",
"properties": {
"house_number": {
"$ref": "#/definitions/address/house_number"
},
"house_name": {
"$ref": "#/definitions/address/house_name"
},
"post_code": {
"$ref": "#/definitions/address/postcode"
}
}
}
},
"required": [
"address"
],
"definitions": {
"address": {
"type": "object",
"properties": {
"postcode": {
"type": "string",
"maxLength": 6
}
},
"anyOf": [
{
"required": [
"house_number"
]
},
{
"required": [
"house_name"
]
}
],
"if": {
"properties": {
"house_name": {
"not": {
"type": "string",
"maxLength": 50
}
}
}
},
"then": {
"properties": {
"house_number": {
"type": "string",
"maxLength": 4
}
}
},
"required": [
"postcode"
]
}
}
}
我的问题是有没有 other/better 方法来实现这个
使用 draft-04
版本而不使用 draft-07
if then keywords?
正如评论中所指出的,这可能已被多次询问。
使用逻辑运算符可以解决以下问题、架构和 json 示例。我不能说它是否更好,它只是将 "anyOf" 内的任何内容分组(以及您可以在需要时添加的邮政编码的要求,并且您可以根据需要构建对完整 "properties" 内部的引用希望等)。或者您可以将其作为严格的 XOR "oneOf"(也如评论中所述)并确保每个案例的地址->属性定义都根据您的需要进行调整。
请阅读(链接到我自己过去的回答并不优雅,但可能会引导您进一步阅读):
针对您的问题(据我了解)的简化架构和示例:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties" : {
"address": {
"type" : "object",
"anyOf" : [
{
"properties" : {
"house_number" : {
"type":"string",
"maxLength": 4
},
},
"required":["house_number"]
},
{
properties : {
"house_name" : {
"type" : "string",
"maxLength" : 50
}
},
"required":["house_name"]
}
]
}
},
required: ["address"],
examples : [
{
baddress: {
}
},
{
address: {
"house_number":"1234",
"house_name" : null
}
},
{
address: {
"house_number":null,
"house_name" : null
}
},
{
address: {
"house_number":null,
"house_name" : "some name"
}
},
{
address: {
"house_number": "12345",
"house_name" : "some afafafasagagagffgfsagragsgasgasssssssfdgsdfgsdfgdsgsdfgsdgsdfgdfsgsdfgs name"
}
},
]
}