如何使用AJV根据输入值验证数据?

时间:2019-12-13 06:57:43

标签: javascript jsonschema ajv

我正在使用AJV来尝试验证某些数据,并根据其他属性的值动态地请求属性。

我要验证的是: -始终需要enabled, -如果enabled = true,则仅必须提供其他属性之一(realtimethresholddigest

有效载荷样本和预期结果:

应该通过

{
  "notifications": {
    "enabled": false
  }
}

应该通过

{
  "notifications": {
    "enabled": true,
    "realtime": true
  }
}

应该通过

{
  "notifications": {
    "enabled": true,
    "digest": true
  }
}

应该通过

{
  "notifications": {
    "enabled": true,
    "threshold": {}
  }
}

应该失败,因为enabled = true,但未设置其他属性。

{
  "notifications": {
    "enabled": true
  }
}

应该失败,因为enabled = true并且设置了一个以上的其他属性。

{
  "notifications": {
    "enabled": true,
    "threshold": {},
    "digest: true
  }
}

这是我使用的验证模式:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Settings",
  "type": "object",
  "properties": {
    "notifications": {
      "type": "object",
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "realtime": {
          "type": "boolean"
        },
        "threshold": {
          "type": "object",
          "properties": {
            "detections": {
              "type": "number"
            },
            "elapsed": {
              "type": "number"
            }
          },
          "required": ["detections", "elapsed"]
        },
        "digest": {
          "type": "boolean"
        }
      },
      "required": ["enabled"],
      "if": {
        "properties": { "enabled": true }
      },
      "then": {
        "oneOf": [
          { "required": [ "realtime" ] },
          { "required": [ "threshold" ] },
          { "required": [ "digest" ] }
        ]
      }
    }
  }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

结果证明我非常亲密,问题在于如何评估if的{​​{1}}语句。这是按预期验证(通过和失败)以上所有示例的正确架构:

true

这部分起到了作用:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Settings",
  "type": "object",
  "properties": {
    "notifications": {
      "type": "object",
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "realtime": {
          "type": "boolean"
        },
        "threshold": {
          "type": "object",
          "properties": {
            "detections": {
              "type": "number"
            },
            "elapsed": {
              "type": "number"
            }
          },
          "required": ["detections", "elapsed"]
        },
        "digest": {
          "type": "boolean"
        }
      },
      "required": ["enabled"],
      "if": {
        "enabled": {
          "const": true
        }
      },
      "then": {
        "oneOf": [
          {
            "required": ["realtime"]
          },
          {
            "required": ["threshold"]
          },
          {
            "required": ["digest"]
          }
        ]
      }
    }
  }
}