【问题标题】:JSON Schema - anyOf within conditional?JSON Schema - 条件内的anyOf?
【发布时间】:2019-09-12 13:03:20
【问题描述】:

我正在尝试使用条件定义 JSON 模式。我构建了一个 MVE,它已经无法按我的预期工作。

我要验证的对象是:

{
  "keiner": false, 
  "abdominal": true,
  "zervikal": false
}

条件规则很简单。当“keiner”为真时,其他两个值都必须为假。如果“keiner”为假,则至少其他两个中的一个必须为真。

我写了这个架构:

{
  "type": "object",
  "properties": {
    "keiner": { "type": "boolean" },
    "abdominal": { "type": "boolean" }
  },
  "if": {
    "properties": {
      "keiner": { "const": true }
    }
  },
  "then": {
    "properties" : {
      "abdominal": { "const": false },
      "zervikal": {"const": false }
    }
  },
  "else": {
    "properties": {
      "anyOf": [
        { "abdominal": { "const": true } },
        { "zervikal": { "const" : true } }
      ]
    }
  }
}

但是 Newtonsoft 在线验证器给出了错误信息

读取“anyOf”的值时遇到意外的标记。预期的 StartObject,布尔值,得到 StartArray。

对于“anyOf”开始的行。这让我很困惑,因为我能找到的所有示例都显示 anyOf 后跟一系列选项。

那我做错了什么?为什么anyOf后面不能有startArray,如何正确编写schema?

【问题讨论】:

  • anyOf 作为模式关键字需要一个子模式数组。但是,您使用 anyOf 作为模式关键字“properties”的子项。所以实际上你正在定义一个名为“anyOf”的属性。这需要一个可以是对象或布尔值的模式。
  • @Clemens 我明白你的意思 - 如果'anyOf' 不在属性对象内,你知道它的正确位置吗?我也试过把它放在'else'里面,但它产生了一个错误。

标签: conditional-statements jsonschema any


【解决方案1】:

我猜这是您正在寻找的架构:

【讨论】:

  • 好的,谢谢。我能够从那里开始并以此为基础。显然我的第二种方法(现在已编辑)几乎是正确的,但我必须将每个数组元素包装在大括号中。一步一步接近语法:)
  • 我注意到一个小东西不见了,最后还需要一个“必需” - 我觉得它不应该有自己的答案,所以我把它添加到你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多