【问题标题】:testing anyOf in json schema where value must be true在值必须为真的 json 模式中测试 anyOf
【发布时间】:2017-08-17 02:08:28
【问题描述】:

我正在验证一个 json 方案,我需要检查 json 是否有一个“活动”数组,如果没有,它是否有一个必须为真的“活动”属性。

我的架构很简单note the enum is not working

const viewSchema = {
    "type": "object",
    "anyOf": [
        {"required": ["live"]},
        {"required": ["activities"]}
    ],
    "properties":{
        "title": {"type": "string"},
        "live": {"type": "boolean", "enum": [ true ]},
        "activities": {"type": "array"}

    }

所以我正在尝试验证以下内容

isValid({title: 'a title'}) // false:  activities or live required
isValid({title: 'a title', activities: []}) // true
isValid({title: 'a title', live: true}) // true
isValid({title: 'a title', live: false) // true - this should be false

【问题讨论】:

  • 您的架构是正确的。如果您得到错误的结果,则可能是验证器中的错误。
  • 使用jsonschemavalidator.net 上的验证器测试您的架构对于这个 json {title: 'a title', live: false} 我得到 Found 1 error(s) Message: Value false is not defined in enum .所以,你的架构没问题。

标签: jsonschema


【解决方案1】:

这有点多余,但您可以使用oneOf 和两个不同的架构来实现这一点。

这是一个使用 AJV 的示例:

// Code goes here

var ajv = new Ajv({
  $data: true,
  verbose: true
});

let schema = {
  "type": "object",
  "oneOf": [{
      "type": "object",
      "properties": {
        "live": {
          "type": "boolean",
          "enum": [true]
        },
      },
      "required": ["live"]
    },
    {
      "type": "object",
      "properties": {
        "activities": {
          "type": "array"
        }
      },
      "required": ["activities"]
    }
  ]
};


ajv.validate(schema, {
  title: 'a title'
}) // false:  activities or live required
console.log('ERRORS: ', this.ajv.errors)
ajv.validate(schema, {
  title: 'a title',
  activities: []
}) // true
console.log('ERRORS: ', this.ajv.errors)
ajv.validate(schema, {
  title: 'a title',
  live: true
}) // true
console.log('ERRORS: ', this.ajv.errors)
ajv.validate(schema, {
  title: 'a title',
  live: false
}) // this is now invalid
console.log('ERRORS: ', this.ajv.errors)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/5.3.0/ajv.bundle.js"></script>

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 2014-07-08
    • 2020-02-03
    • 2014-09-11
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多