验证 JSON 至少一个包含特定值的架构属性
Validate JSON Schema properties with at least one containing specific value
我想知道我是否可以定义一个 JSON 模式(草案 4),它至少需要许多属性中的一个具有特定值。
为了说明,这里有一个例子JSON我希望FAIL验证:
{
"daysOfWeek": {
"mon": false,
"tue": false,
"wed": false,
"thu": false,
"fri": false,
"sat": false,
"sun": false
}
}
但是,如果上述属性中的任何(一个或多个)设置为 true
,只有到那时我才希望它通过验证。
那么 Schema 是什么?
{
"daysOfWeek": {
"type": "object",
"properties": {
"mon": { "type": "boolean" },
"tue": { "type": "boolean" },
"wed": { "type": "boolean" },
"thu": { "type": "boolean" },
"fri": { "type": "boolean" },
"sat": { "type": "boolean" },
"sun": { "type": "boolean" }
},
"anyOf": [{
// ?
}]
}
}
非常感谢!
您可以使用 enum
关键字来指定 属性 具有特定值。您可以将该技巧与 anyOf
结合使用以获得所需的验证行为。
{
"type": "object",
"properties": {
"daysOfWeek": {
"type": "object",
"properties": {
"mon": { "type": "boolean" },
"tue": { "type": "boolean" },
"wed": { "type": "boolean" },
"thu": { "type": "boolean" },
"fri": { "type": "boolean" },
"sat": { "type": "boolean" },
"sun": { "type": "boolean" }
},
"anyOf": [
{
"properties": {
"mon": { "enum": [true] }
}
},
{
"properties": {
"tue": { "enum": [true] }
}
},
{
"properties": {
"wed": { "enum": [true] }
}
},
{
"properties": {
"thu": { "enum": [true] }
}
},
{
"properties": {
"fri": { "enum": [true] }
}
},
{
"properties": {
"sat": { "enum": [true] }
}
},
{
"properties": {
"sun": { "enum": [true] }
}
}
]
}
}
}
@Jason 的回答对于您这里的案例来说很好(并且可读)。在一般情况下(您可能拥有任意数量的属性),有一种更简洁的方式(但可读性较差):
您可以将您的要求改写为 "The properties are not all allowed to be false",在这种情况下,模式可以是:
{
"type": "object",
"properties": {...},
"not": {
"additionalProperties": {"enum": [false]}
}
}
additionalProperties
在子架构中,因此它未连接到根级别的 properties
值。因此它适用于所有属性。
not
内的子模式只有在所有属性都是 false
时才会通过 - 因此外部模式只有在 不是 所有属性都是 false
.
我想知道我是否可以定义一个 JSON 模式(草案 4),它至少需要许多属性中的一个具有特定值。
为了说明,这里有一个例子JSON我希望FAIL验证:
{
"daysOfWeek": {
"mon": false,
"tue": false,
"wed": false,
"thu": false,
"fri": false,
"sat": false,
"sun": false
}
}
但是,如果上述属性中的任何(一个或多个)设置为 true
,只有到那时我才希望它通过验证。
那么 Schema 是什么?
{
"daysOfWeek": {
"type": "object",
"properties": {
"mon": { "type": "boolean" },
"tue": { "type": "boolean" },
"wed": { "type": "boolean" },
"thu": { "type": "boolean" },
"fri": { "type": "boolean" },
"sat": { "type": "boolean" },
"sun": { "type": "boolean" }
},
"anyOf": [{
// ?
}]
}
}
非常感谢!
您可以使用 enum
关键字来指定 属性 具有特定值。您可以将该技巧与 anyOf
结合使用以获得所需的验证行为。
{
"type": "object",
"properties": {
"daysOfWeek": {
"type": "object",
"properties": {
"mon": { "type": "boolean" },
"tue": { "type": "boolean" },
"wed": { "type": "boolean" },
"thu": { "type": "boolean" },
"fri": { "type": "boolean" },
"sat": { "type": "boolean" },
"sun": { "type": "boolean" }
},
"anyOf": [
{
"properties": {
"mon": { "enum": [true] }
}
},
{
"properties": {
"tue": { "enum": [true] }
}
},
{
"properties": {
"wed": { "enum": [true] }
}
},
{
"properties": {
"thu": { "enum": [true] }
}
},
{
"properties": {
"fri": { "enum": [true] }
}
},
{
"properties": {
"sat": { "enum": [true] }
}
},
{
"properties": {
"sun": { "enum": [true] }
}
}
]
}
}
}
@Jason 的回答对于您这里的案例来说很好(并且可读)。在一般情况下(您可能拥有任意数量的属性),有一种更简洁的方式(但可读性较差):
您可以将您的要求改写为 "The properties are not all allowed to be false",在这种情况下,模式可以是:
{
"type": "object",
"properties": {...},
"not": {
"additionalProperties": {"enum": [false]}
}
}
additionalProperties
在子架构中,因此它未连接到根级别的 properties
值。因此它适用于所有属性。
not
内的子模式只有在所有属性都是 false
时才会通过 - 因此外部模式只有在 不是 所有属性都是 false
.