我们将子网名称作为子网映射中的键。我想创建架构以根据嵌套在子网中的 vpc_access 键来限制子网名称长度。
我知道可以通过
properties.PROPERTY1.properties.PROPERTY2.const.VALUE
对嵌套属性设置条件,但就我而言,我不知道确切的属性名称,因为我正在使用 patternProperties
。
所以我正在尝试做这样的事情。它是以 yaml 形式编写的 JSON 模式。
subnets:
if:
patternProperties:
^.*$:
properties:
vpc_access:
const: true
required:
- vpc_access
then:
propertyNames:
pattern: ^[a-z][a-z0-9-]{1,22}[a-z0-9]$
patternProperties:
^.*$:
$ref: /schemas/network.subnet
您能否确认这在模式中是否可行并帮助如何做到这一点?
patternProperties
只会评估与模式匹配的键。否则,任何其他属性将根据架构的其他部分进行评估,或者根据架构的约束一起忽略
在此示例中,任何与模式匹配的对象都将期望具有所需键的对象
vpc_access: true
。否则,任何与模式不匹配的其他属性都将需要任何 network.subnet
模式。
subnets:
patternProperties:
'^[a-z][a-z0-9-]{1,22}[a-z0-9]$':
type: object
properties:
vpc_access:
type: boolean
const: true
required:
- vpc_access
additionalProperties:
$ref: /schemas/network.subnet
如果您尝试评估
vpc_access
的值以强制执行密钥长度,则无法评估父密钥的嵌套值。
另一方面,如果您的数据实例期望
vpc_access: true
并且密钥长度与模式匹配,并且密钥与模式匹配且 vpc_access
的值为 false
,则实例将无法验证,因为您将模式限制为仅允许 const: true
,有效地为您提供与您的请求类似的输出。