JSON if/then/else 架构未按预期工作
JSON Schema not working as expected with if/then/else
我有以下架构:
{
"type": "object",
"properties": {
"street_address": {
"type": "string"
},
"country": {
"default": "United States of America",
"enum": ["United States of America", "Canada", "Netherlands"]
}
},
"allOf": [
{
"if": {
"properties": { "country": { "const": "United States of America" } }
},
"then": {
"properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
}
},
{
"if": {
"properties": { "country": { "const": "Canada" } },
"required": ["country"]
},
"then": {
"properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
}
},
{
"if": {
"properties": { "country": { "const": "Netherlands" } },
"required": ["country"]
},
"then": {
"properties": { "postal_code": { "pattern": "[0-9]{4} [A-Z]{2}" } }
}
}
]
}
这是从这里复制的https://json-schema.org/understanding-json-schema/reference/conditionals.html
当我将 allOf
关键字更改为 anyOf
时,它给了我意想不到的结果。我正在使用 Ajv 进行验证。
即使使用以下数据也能通过验证:
{ country: "Canada", postal_code: "some invalid code" }
但是当我只留下一个 if/then
语句(对于加拿大)时,它会按预期失败。
在我将关键字更改为 oneOf
的情况下,它失败了,因为传递的模式不止一个。
为什么会这样?
您的条件没有任何“else”子句——所以如果 if
部分为假,else
将默认为 true
这将导致该分支allOf
为真。您可能想为其中的每一个添加一个 "else": false
。
(此外,我注意到您的正则表达式未锚定 - 因此例如“abc01234xyz”将匹配您的美国 postal_code 模式。)
我有以下架构:
{
"type": "object",
"properties": {
"street_address": {
"type": "string"
},
"country": {
"default": "United States of America",
"enum": ["United States of America", "Canada", "Netherlands"]
}
},
"allOf": [
{
"if": {
"properties": { "country": { "const": "United States of America" } }
},
"then": {
"properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
}
},
{
"if": {
"properties": { "country": { "const": "Canada" } },
"required": ["country"]
},
"then": {
"properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
}
},
{
"if": {
"properties": { "country": { "const": "Netherlands" } },
"required": ["country"]
},
"then": {
"properties": { "postal_code": { "pattern": "[0-9]{4} [A-Z]{2}" } }
}
}
]
}
这是从这里复制的https://json-schema.org/understanding-json-schema/reference/conditionals.html
当我将 allOf
关键字更改为 anyOf
时,它给了我意想不到的结果。我正在使用 Ajv 进行验证。
即使使用以下数据也能通过验证:
{ country: "Canada", postal_code: "some invalid code" }
但是当我只留下一个 if/then
语句(对于加拿大)时,它会按预期失败。
在我将关键字更改为 oneOf
的情况下,它失败了,因为传递的模式不止一个。
为什么会这样?
您的条件没有任何“else”子句——所以如果 if
部分为假,else
将默认为 true
这将导致该分支allOf
为真。您可能想为其中的每一个添加一个 "else": false
。
(此外,我注意到您的正则表达式未锚定 - 因此例如“abc01234xyz”将匹配您的美国 postal_code 模式。)