JSON 模式验证 draft-07 中 "minContains" & "maxContains" 的解决方法?
Workaround for "minContains" & "maxContains" in JSON Schema validation draft-07?
最新的 JSON 模式验证版本 (2019-09) 允许使用 contains[=34 放置条件(子模式) =] 关键字以及使用 minContains & [= 该条件在 JSON 模式中可以出现多少次29=]最大包含。此功能在 draft-07 中不可用。有没有办法在不使用这些关键字的情况下实现这一目标?例如
"answers": [
{
"id": 1,
"text": "choice1",
"isCorrect": true
},
{
"id": 1,
"text": "choice2",
"isCorrect": false
},
{
"id": 1,
"text": "choice3",
"isCorrect": false
},
{
"id": 1,
"text": "choice4",
"isCorrect": false
}
]
}
包含的条件如下:
"contains":{
"properties":{
"isCorrect":{
"enum":["true"]
}
}
}
这会检查 isCorrect
至少一次是 true
。但是,如果我希望仅当 isCorrect
的值至少两次为 true
时才通过验证,我该如何实现?
任何帮助表示赞赏!谢谢。
不,没有,这就是我们为草稿添加关键字的原因 2019-09
。对不起。
在 draft-07 中没有真正模拟 minContains
/maxContains
的方法。以下是您可以获得的最接近的示例。
如"minContains": 2
,如果你有固定数量的元素。这不是很漂亮,但是您可以枚举这两个项目在数组中出现的所有可能方式。
{
"type": "array",
"maxItems": 4,
"minItems": 4,
"anyOf": [
{
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
true,
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
true,
true,
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
true,
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
true,
{ "$ref": "#/definitions/isCorrect-true" },
true,
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
true,
true,
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
]
}
],
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
类似于 "minContains": 2
,除了所有 true
项都需要在数组中排在第一位。
{
"type": "array",
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
],
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
类似于 "maxContains": 2
,除了所有 true
项都需要在数组中排在第一位。
{
"type": "array",
"items": [
true,
true
],
"additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
类似于 "minContains": 2, "maxContains": 2
,除了所有 true
项都需要在数组中排在第一位。
{
"type": "array",
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
],
"additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
最新的 JSON 模式验证版本 (2019-09) 允许使用 contains[=34 放置条件(子模式) =] 关键字以及使用 minContains & [= 该条件在 JSON 模式中可以出现多少次29=]最大包含。此功能在 draft-07 中不可用。有没有办法在不使用这些关键字的情况下实现这一目标?例如
"answers": [
{
"id": 1,
"text": "choice1",
"isCorrect": true
},
{
"id": 1,
"text": "choice2",
"isCorrect": false
},
{
"id": 1,
"text": "choice3",
"isCorrect": false
},
{
"id": 1,
"text": "choice4",
"isCorrect": false
}
]
}
包含的条件如下:
"contains":{
"properties":{
"isCorrect":{
"enum":["true"]
}
}
}
这会检查 isCorrect
至少一次是 true
。但是,如果我希望仅当 isCorrect
的值至少两次为 true
时才通过验证,我该如何实现?
任何帮助表示赞赏!谢谢。
不,没有,这就是我们为草稿添加关键字的原因 2019-09
。对不起。
在 draft-07 中没有真正模拟 minContains
/maxContains
的方法。以下是您可以获得的最接近的示例。
如"minContains": 2
,如果你有固定数量的元素。这不是很漂亮,但是您可以枚举这两个项目在数组中出现的所有可能方式。
{
"type": "array",
"maxItems": 4,
"minItems": 4,
"anyOf": [
{
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
true,
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
true,
true,
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
true,
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
true,
{ "$ref": "#/definitions/isCorrect-true" },
true,
{ "$ref": "#/definitions/isCorrect-true" }
]
},
{
"items": [
true,
true,
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
]
}
],
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
类似于 "minContains": 2
,除了所有 true
项都需要在数组中排在第一位。
{
"type": "array",
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
],
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
类似于 "maxContains": 2
,除了所有 true
项都需要在数组中排在第一位。
{
"type": "array",
"items": [
true,
true
],
"additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}
类似于 "minContains": 2, "maxContains": 2
,除了所有 true
项都需要在数组中排在第一位。
{
"type": "array",
"items": [
{ "$ref": "#/definitions/isCorrect-true" },
{ "$ref": "#/definitions/isCorrect-true" }
],
"additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
"definitions": {
"isCorrect-true": {
"type": "object",
"properties": {
"isCorrect": { "const": true }
}
}
}
}