【问题标题】:XOR logic in JSON schema for a list of boolean itemsJSON 模式中用于布尔项列表的 XOR 逻辑
【发布时间】:2017-02-03 14:09:39
【问题描述】:

我在验证布尔值列表时遇到了问题。我的意见是:

[true,true,false]

它应该验证这一点,因为只有一个且只有一个真值的列表应该是真的。目前,我的架构通过接受一个或多个真实值(但不是全部)来执行某种包容性 OR:

{
  "type": "array",
  "items": {
    "$ref": "#/definitions/_items"
  },
  "$ref": "#/definitions/xor",
  "definitions": {
    "xor": {
      "oneOf": [
        {
          "$ref": "#/definitions/or"
        },
        {
          "$ref": "#/definitions/and"
        }
      ]
    },
    "_items": {
      "enum": [
        true,
        1
      ]
    },
    "or": {
      "not": {
        "type": "array",
        "items": {
          "not": {
            "$ref": "#/definitions/_items",
            "maximum": 1,
            "minimum": 1
          }
        }
      }
    },
    "and": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/_items"
      }
    }
  }
}

如您所见,我尝试使用最大和最小属性来解决它,但它们似乎不会影响结果。

一个真值表应该是:

[true,true,false] => 错误

[true,true,true] => 错误

[true,false,false] => 是的

[false,false,false] => 错误

[false,true,false] => 是的

[false,false,true] => 是的

[true,false,true] => 错误

[false,true,true] => 错误

【问题讨论】:

    标签: javascript validation logic jsonschema


    【解决方案1】:

    你可以明确地使用你的真值表:

    {
      "type": "array",
      "minItems": 3,
      "maxItems": 3,
      "anyOf": [
        {
          "items": [
            { "enum": [true] },
            { "enum": [false] },
            { "enum": [false] }
          ]
        },
        {
          "items": [
            { "enum": [false] },
            { "enum": [true] },
            { "enum": [false] }
          ]
        },
        {
          "items": [
            { "enum": [false] },
            { "enum": [false] },
            { "enum": [true] }
          ]
        }
      ]
    }
    

    如果您想要一个包含 3 个以上项目的通用解决方案,它很快就会失控。

    draft-06 定义了关键字“contains”,它允许验证至少一个项目与某个模式匹配(但不完全是一个),但据我所知,标准 JSON 模式关键字不允许你想要的。

    您可以以编程方式生成架构(对于任何固定数量的项目)或不使用架构进行验证。

    【讨论】:

    • 我在某个时候在想类似的事情,因为实际上我正在以编程方式创建架构。感谢您的建议。
    • 我同意 JSON Schema 无法表达这一点,但是这可以通过使用数组作为枚举值来更简单地完成。 { "enum": [[true, false, false], [false, true, false], [false, false, true]] }。但是,您只能使用这种较短的符号,因为您使用的是布尔值。
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2013-01-28
    相关资源
    最近更新 更多