在我的模式中,我声明了以下属性:
"index_name": {
"type": "string",
"examples": ["foo-wwen-live", "foo"]
},
"locale": {
"type": "string",
"examples": ["wwen", "usen", "frfr"]
},
"environment": {
"type": "string",
"default": "live",
"examples": [
"staging",
"edgengram",
"test"
]
}我希望通过我的模式验证的JSON主体只有在的情况下才是有效的
index_name 是存在的,而 locale和environment 都不是locale和/或enviroment E 118是E 219,index_name E 121不是E 222当前H 223F 224简而言之,locale和environment不应与index_name混为一谈。
测试用例和期望的结果:
这些应该通过:
案件1
{
"locale": "usen"
}案例2
{
"environment": "foo"
}案件3
{
"environment": "foo",
"locale": "usen"
}案例4
{
"index_name": "foo-usen"
}这些不应该通过:
案例5
{
"index_name": "foo-usen",
"locale": "usen"
}案例6
{
"index_name": "foo-usen",
"environment": "foo"
}案例7
{
"index_name": "foo-usen",
"locale": "usen",
"environment": "foo"
}我为我的模式创建了以下规则,但是它并不涵盖所有的情况。例如,如果同时存在locale和environment,如果index_name也存在,则验证返回失败,根据案例7,这是正确的行为。但是,如果只有locale和environment中的一个存在,则允许index_name也出现(在案例#5和#6中失败)。
"oneOf": [
{
"required": ["index_name"],
"not": {"required": ["locale", "environment"]}
},
{
"anyOf": [
{
"required": ["locale"],
"not": {"required": ["index_name"]}
},
{
"required": ["environment"],
"not": {"required": ["index_name"]}
}
]
}
]关于"not": {"required": []}声明的工作方式,我得到的信息参差不齐。Some people声称这意味着它禁止数组中声明的任何内容存在,这与语法给出的想法相反。Other claim表示,这应该完全按照听起来的方式进行:数组中列出的属性是而不是必需的--它们可以存在,但如果不存在则无关紧要。
除此规则外,我还要求在所有情况下都有一个与此无关的属性,并设置了"additionalProperties": false。
什么规则可以满足我所有的测试用例?
发布于 2020-04-06 15:07:35
依赖关系
这是dependencies关键字的作业。以下所述
如果"locale“存在,则禁止
|
"dependencies": {
"locale": { "not": { "required": ["index_name"] } },
"environment": { "not": { "required": ["index_name"] } }
}not-required怎么了
有一个关于not-required如何工作的子问题。它令人困惑,因为它并不意味着它是如何用英语阅读的,但它的相似之处足以让我们认为它有时是这样的。
在上面的例子中,如果我们把它理解为“不需要”,它的意思似乎是“可选的”。更准确的描述将被“禁止”。
很尴尬,但也不算太糟。当你想要“禁止”一个以上的属性时,就会让人感到困惑。假设我们想说,如果"foo“存在,那么"bar”和"baz“是被禁止的。你要做的第一件事就是这个。
"dependencies": {
"foo": { "not": { "required": ["bar", "baz"] } }
}但是,这说明如果"foo“存在,则如果"bar”和"baz“同时存在,则实例无效。他们都必须在场才能触发失败。我们真正想要的是,如果"bar“或"baz”存在,它就无效。
"dependencies": {
"foo": {
"not": {
"anyOf": [
{ "required": ["bar"] },
{ "required": ["baz"] }
]
}
}
}为什么这么难?
JSON架构是针对允许更改的架构进行优化的。架构应该强制执行实例具有完成某项任务所需的数据。如果它有超出其需要的内容,则应用程序将忽略其余部分。这样,如果将某些内容添加到实例中,则一切都仍然有效。如果实例有一些应用程序不使用的额外字段,那么它不应该失败验证。
因此,当您尝试做一些其他可以忽略的事情,比如禁止的事情时,您会遇到一些与JSON格格不入的问题,事情可能会变得有点糟糕。然而,有时这是必要的。我对您的情况不太了解,无法打那个电话,但我猜想在这种情况下dependencies可能是必要的,但additionalProperties不是。
发布于 2020-04-06 14:45:44
因为required: [a, b]的意思是(a必须在场,b必须在场)
那么not: {required: [a, b]}的意思是(不是(a必须在场,b必须在场))
它在逻辑上等同于(a不能存在或b不能存在)。
所以说(a不在场,b不在场),这不是正确的表述。您需要两个not。
考虑到您的要求,下面是正确的表达式:
{
"oneOf": [
{
"required": ["index_name"],
"allOf": [
{"not": {"required": ["locale"]}},
{"not": {"required": ["environment"]}}
]
},
{
"anyOf": [
{"required": ["locale"]},
{"required": ["environment"]}
],
"not": {
"required": ["index_name"]
}
}
]
}https://stackoverflow.com/questions/61059683
复制相似问题