JSON 架构:如果未在属性中定义,则忽略必需的 属性
JSON Schema: Ignore required property if not defined in properties
如果 properties
定义中不存在 属性,有什么方法可以忽略它?
例如:
{
"type": "object",
"properties": {
"billingAddress": {
"type": "string"
},
"isSameAsBillingAddress": {
"type": "boolean"
}
// Say I deleted the `mailingAddress` property
},
"required": [
"billingAddress",
"isSameAsBillingAddress",
"mailingAddress" // ignore
]
}
据我了解,这似乎不可能。我知道这是一个愚蠢的问题,因为有人可能会说从 required
数组中删除 属性 名称,但是当我生成这个 JSON 模式时它变得有点复杂并且还想有条件地要求一个字段(如果存在)。
例如:
{
"type": "object",
"properties": {
"billingAddress": {
"type": "string"
},
"isSameAsBillingAddress": {
"type": "boolean"
}
// Delete `mailingAddress` property
},
"required": [
"billingAddress",
"isSameAsBillingAddress"
],
"oneOf": [
{
"properties": {
"isSameAsBillingAddress": {
"enum": [true]
}
}
},
{
"properties": {
"isSameAsBillingAddress": {
"enum": [false]
}
},
// Would like to ignore...
"required": ["mailingAddress"]
},
]
}
是的,如果 mailingAddress
属性 被删除,我可以写一些代码返回并清理这个模式,但我想知道是否有一些 JSON 模式方式智能地忽略未定义的 properties
?
此外,从 JSON 模式生成器的角度来看,属性 名称似乎有太多地方可能潜伏,因此关于如何构建代码可以轻松清理的任何建议并生成连贯的 JSON 架构,我们也将不胜感激。
没有。 required
有意独立于 properties
。 required
验证存在; properties
验证子架构 if 存在。
conditionally require a field if it exists
我对这可能意味着什么感到困惑 - 感觉倒退到 required
的地步。如果你只需要一个字段存在时存在,为什么要有 required
?
也许您只是想完全删除 required
个关键字?
这似乎更适合模式 linter -- 警告您 属性 定义丢失并且可能被意外删除。
您可以在此处找到 linter 列表 -- https://json-schema.org/implementations.html#schema-linter --
如果此检查尚未实施,则可能相当容易。
所以我认为不应忽略不在属性中的必需 属性 名称。参见 https://datatracker.ietf.org/doc/html/draft-fge-json-schema-validation-00#section-5.4.3
在您的示例中,mailingAddress 必须存在并且其值可以是任何类型,因为 additionalProperties 默认为允许任何类型值的空对象。
如果 properties
定义中不存在 属性,有什么方法可以忽略它?
例如:
{
"type": "object",
"properties": {
"billingAddress": {
"type": "string"
},
"isSameAsBillingAddress": {
"type": "boolean"
}
// Say I deleted the `mailingAddress` property
},
"required": [
"billingAddress",
"isSameAsBillingAddress",
"mailingAddress" // ignore
]
}
据我了解,这似乎不可能。我知道这是一个愚蠢的问题,因为有人可能会说从 required
数组中删除 属性 名称,但是当我生成这个 JSON 模式时它变得有点复杂并且还想有条件地要求一个字段(如果存在)。
例如:
{
"type": "object",
"properties": {
"billingAddress": {
"type": "string"
},
"isSameAsBillingAddress": {
"type": "boolean"
}
// Delete `mailingAddress` property
},
"required": [
"billingAddress",
"isSameAsBillingAddress"
],
"oneOf": [
{
"properties": {
"isSameAsBillingAddress": {
"enum": [true]
}
}
},
{
"properties": {
"isSameAsBillingAddress": {
"enum": [false]
}
},
// Would like to ignore...
"required": ["mailingAddress"]
},
]
}
是的,如果 mailingAddress
属性 被删除,我可以写一些代码返回并清理这个模式,但我想知道是否有一些 JSON 模式方式智能地忽略未定义的 properties
?
此外,从 JSON 模式生成器的角度来看,属性 名称似乎有太多地方可能潜伏,因此关于如何构建代码可以轻松清理的任何建议并生成连贯的 JSON 架构,我们也将不胜感激。
没有。 required
有意独立于 properties
。 required
验证存在; properties
验证子架构 if 存在。
conditionally require a field if it exists
我对这可能意味着什么感到困惑 - 感觉倒退到 required
的地步。如果你只需要一个字段存在时存在,为什么要有 required
?
也许您只是想完全删除 required
个关键字?
这似乎更适合模式 linter -- 警告您 属性 定义丢失并且可能被意外删除。
您可以在此处找到 linter 列表 -- https://json-schema.org/implementations.html#schema-linter -- 如果此检查尚未实施,则可能相当容易。
所以我认为不应忽略不在属性中的必需 属性 名称。参见 https://datatracker.ietf.org/doc/html/draft-fge-json-schema-validation-00#section-5.4.3
在您的示例中,mailingAddress 必须存在并且其值可以是任何类型,因为 additionalProperties 默认为允许任何类型值的空对象。