You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JSON Schema实现VRF属性在VLAN对象中全有或全无的校验?

解决方案

要实现所有VLAN对象统一包含或统一不包含vrf属性的校验规则,简单的allOf-if-then无法覆盖动态的VLAN键名,需用oneOf结合additionalProperties约束所有VLAN实例的一致性,具体Schema写法如下:

YAML 版本 Schema

type: object
properties:
  vlans:
    type: object
    # 定义VLAN基础规则:必填id和subnet,声明vrf合法结构
    $defs:
      vlanBase:
        type: object
        required: ["id", "subnet"]
        properties:
          id:
            type: integer
          subnet:
            type: string
            format: ipv4-cidr
          vrf:
            type: string
    # 所有VLAN需符合基础规则,且满足二选一的一致性要求
    oneOf:
      - # 场景1:所有VLAN均不能包含vrf属性
        additionalProperties:
          allOf:
            - $ref: "#/properties/vlans/$defs/vlanBase"
            - not:
                required: ["vrf"]
      - # 场景2:所有VLAN必须包含vrf属性
        additionalProperties:
          allOf:
            - $ref: "#/properties/vlans/$defs/vlanBase"
            - required: ["vrf"]

规则说明

  1. 基础约束:通过$defs.vlanBase统一规定每个VLAN必须包含id和subnet,同时明确vrf的合法数据结构。
  2. 一致性约束:oneOf强制vlans下的所有VLAN只能符合两种场景之一:
    • 所有VLAN禁止出现vrf属性(用not: {required: ["vrf"]}拦截该属性)
    • 所有VLAN必须存在vrf属性(用required: ["vrf"]强制要求)
  3. 动态键兼容:用additionalProperties替代具体键名(如vlan1、vlan2),能适配任意命名的VLAN对象。

原方案失效原因

if-then通常针对特定属性或固定实例做条件校验,但vlans下的VLAN键名是动态的,无法提前枚举所有可能的键名,导致规则只能覆盖部分情况,无法约束所有VLAN的一致性。

内容的提问来源于stack exchange,提问作者chrixm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:18:23