确保在JSON架构中,数组的一个属性为true



我有一个选项数组。数组中的每个项都将具有文本和布尔值isAnswer,我正在尝试以一种方式验证,即只有一个项可以并且必须标记为true。其他任何内容都应无效。通过两个项目为true或0为true应失败。我一直在玩oneOf,因为这似乎最有意义,但它总是证明成功。

首先,这是否可以验证?第二,我走对了吗?

感谢您为提供的任何帮助

"question": {
"title": "Question",
"type": "object",
"properties": {
"options": {
"title": "Options",
"type": "array",
"minItems": 2,
"maxItems": 10,
"items": {
"title": "Option",
"type": "object",
"properties": {
"isAnswer": {
"title": "Answer",
"type": "boolean",
"format": "checkbox",
"default": false
},
"text": {
"title": "Choice Text",
"type": "string"
},
},
"oneOf": [
{
"properties": {
"isAnswer": true
}
}
]
}
}
}
}

这个问题几乎与如何在数组中只强制一个属性值为true(JSON模式(相同-请检查该属性值的答案。

这有点不同,因为你有一个maxItems——这打开了一个丑陋的选项,强行使用可能的组合。

我要假装你的maxItems是3而不是10,以减少冗长:

definitions:
correctAnswer:
{properties: {isAnwser: {const: true}}}
incorrectAnswer:
{properties: {isAnwser: {const: false}}}
oneOf:
- items: [{'$ref': '#/definitions/correctAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}]
- items: [{'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/correctAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}]
- items: [{'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/correctAnswer'}]

丑陋且难以维护!最好在你的代码中写下这个要求,除非/直到你可以使用2019-09。

其他注意事项:

  • oneOf检查一组模式中的一个模式是否针对实例进行验证,而不是检查数组实例中的某个元素是否针对模式进行验证。

  • 你有"properties": {"isAnswer": true}——你想要的是"properties": {"isAnswer": {"const": true}}。您将使用与任何实例匹配的true模式const匹配与其值相等的实例。

这种测试被称为"业务逻辑"或"数据一致性验证",不属于JSON模式(以及大多数验证工具,如XML模式、RELAX NG等(的范围。有关此方面的更多信息,请参阅JSON模式验证的范围。

从技术上讲,通过精心制作不同的模式,为每个可能的正确答案编写一个模式,可以编写一个产生你想要的结果的模式。类似的解决方案用于验证不同类别的对象,其中"类别"或"类型"字段决定如何验证所有其他属性。

但是,JSONSchema通常不支持将一个值与另一个值进行比较。

就模式布局而言,您的模式是可以接受的;但我会考虑将答案与问题分开说明:

{
"options": [
{ "text": "Butaful" },
{ "text": "Bueatful" },
{ "text": "Beautiful" },
{ "text": "Beeyoutiful" }
],
"answer": "Beautiful"
}

这增加了一些冗余,并支持自由形式的答案。

相关内容

  • 没有找到相关文章

最新更新