JSON模式中的XOR逻辑,用于布尔项的列表

时间:2017-02-03 14:09:40

标签: javascript validation logic jsonschema

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

[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] =>假

1 个答案:

答案 0 :(得分: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定义了关键字"包含"这允许验证至少有一个项目与某个模式匹配(但不完全是一个),但据我所知,标准的JSON模式关键字不允许你想要的东西。

您可以以编程方式(对于任何固定数量的项目)生成架构,也可以在没有架构的情况下进行验证。