JSON Schema 如何在 petternProperties 上创建条件

问题描述 投票:0回答:1

我们将子网名称作为子网映射中的键。我想创建架构以根据嵌套在子网中的 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

您能否确认这在模式中是否可行并帮助如何做到这一点?

json yaml jsonschema
1个回答
0
投票

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
,有效地为您提供与您的请求类似的输出。

© www.soinside.com 2019 - 2024. All rights reserved.