我遇到了验证布尔值列表的问题。我的意见是:
[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]
=>假
答案 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模式关键字不允许你想要的东西。
您可以以编程方式(对于任何固定数量的项目)生成架构,也可以在没有架构的情况下进行验证。