【问题标题】:How to validate data based on an input value with AJV?如何使用 AJV 根据输入值验证数据?
【发布时间】:2019-12-13 06:57:43
【问题描述】:

我正在使用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" ] }
        ]
      }
    }
  }
}

谢谢!

【问题讨论】:

  • 你的意思是,到目前为止你有这个 Schema 但它不起作用?
  • 我不明白你的问题是什么。你能更具体一点吗?也许举一些数据作为您希望通过和失败的数据的示例?
  • @Relequestual - 我更新了问题,欢迎尝试。
  • 您的解决方案与我在您更新问题后的建议几乎相同。

标签: javascript jsonschema ajv


【解决方案1】:

结果我非常接近,问题是如何评估 if 语句为 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"]
          }
        ]
      }
    }
  }
}

这部分成功了:

"if": {
    "properties": {
        "enabled": {
            "const": true
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多