我如何需要一个或另一个领域或(另外两个)中的一个但不是全部?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何需要一个或另一个领域或(另外两个)中的一个但不是全部?相关的知识,希望对你有一定的参考价值。
我在设置JSON模式时遇到问题,该模式将验证JSON是否包含:
- 只有一个领域
- 另一个领域
- (仅限于其他两个领域之一)
但是当它们的倍数存在时不匹配。
在我的具体情况下,我想要一个
copyAll
fileNames
matchesFiles
和/或doesntMatchFiles
验证,但我不想接受超过那个。
这是我到目前为止所得到的:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [ "unrelatedA" ],
"properties": {
"unrelatedA": {
"type": "string"
},
"fileNames": {
"type": "array"
},
"copyAll": {
"type": "boolean"
},
"matchesFiles": {
"type": "array"
},
"doesntMatchFiles": {
"type": "array"
}
},
"oneOf": [
{"required": ["copyAll"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["fileNames"]}},
{"required": ["fileNames"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["copyAll"]}},
{"anyOf": [
{"required": ["matchesFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}},
{"required": ["doesntMatchFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}]}
]
} ;
这比我想要的更多。我希望这匹配以下所有内容:
{"copyAll": true, "unrelatedA":"xxx"}
{"fileNames": ["aab", "cab"], "unrelatedA":"xxx"}
{"matchesFiles": ["a*"], "unrelatedA":"xxx"}
{"doesntMatchFiles": ["a*"], "unrelatedA":"xxx"}
{"matchesFiles": ["a*"], "doesntMatchFiles": ["*b"], "unrelatedA":"xxx"}
但不匹配:
{"copyAll": true, "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"copyAll": true, "doesntMatchFiles": ["*b"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"unrelatedA":"xxx"}
我猜我有一些显而易见的东西 - 我想知道它是什么。
答案
问题是“不”语义。 “不要求”并不意味着“包容禁止”。它只是意味着您不必添加它以验证该架构。
但是,您可以使用“oneOf”以更简单的方式满足您的规范。请记住,这意味着“只需要其中一个模式可以验证”。以下模式实现了您尝试解决的属性切换:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"unrelatedA"
],
"properties": {
"unrelatedA": {
"type": "string"
},
"fileNames": {
"type": "array"
},
"copyAll": {
"type": "boolean"
},
"matchesFiles": {
"type": "array"
},
"doesntMatchFiles": {
"type": "array"
}
},
"oneOf": [
{
"required": [
"copyAll"
]
},
{
"required": [
"fileNames"
]
},
{
"anyOf": [
{
"required": [
"matchesFiles"
]
},
{
"required": [
"doesntMatchFiles"
]
}
]
}
]
}
以上是关于我如何需要一个或另一个领域或(另外两个)中的一个但不是全部?的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 GraphQL 查询,以便需要一个或另一个参数,但不是两者都需要
如何根据条件配置Angular 5中的app-routing.module来加载两个子路由模块中的一个或另一个?
如何创建一个 UIViewController 具有两个视图,根据单击的按钮显示一个或另一个