我有一个用例,根据不同键的值,我想检查JSON中的键。
示例JSON-1:
{
"key_name" : "value1",
"foo" : "random_value1"
}示例JSON-2:
{
"key_name" : "value2",
"bar" : "random_value2"
}根据这些例子,
规则1.如果"key_name“的值是"value1”,那么JSON中应该出现只存在 "foo“键。
如果"key_name“的值是"value2",那么只有 "bar”键应该出现在JSON中。
我编写了以下JSON模式来验证这些JSON:
{
"type": "object",
"properties": {
"key_name": {
"type": "string",
"enum": [
"value1",
"value2"
]
},
"foo": {
"type": "string"
},
"bar": {
"type": "string"
}
},
"required": [
"key_name"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"key_name": {
"enum": [
"value1"
]
}
}
},
"then": {
"required": [
"foo"
]
}
},
{
"if": {
"properties": {
"key_name": {
"enum": [
"value2"
]
}
}
},
"then": {
"required": [
"bar"
]
}
}
]
}现在,按照规则,下面的JSON是无效的,应该会引发一个错误。
{
"key_name" : "value1",
"foo" : "random_value1",
"bar" : "random_value2"
}或
{
"key_name" : "value2",
"bar" : "random_value2",
"foo" : "random_value"
}但是,上面的无法做到这一点。它只根据"key_name“的值检查"foo"/"bar”键是否正确。它无法检查是否存在任何新密钥。
怎么做呢?
发布于 2020-04-27 04:36:01
这里已经回答了这个问题:Mutually exclusive property groups。
此外,您还可以在这里找到一个很好的概述:jsonSchema attribute conditionally required。
对于您的具体示例,您会想到以下方法:
"not": { "required": ["bar"] }添加到第一个then子句中,以指示不允许使用"bar"。"foo"在第二个then子句中也是如此。"key_name"和另一个属性,也可以简单地在主模式中添加"maxProperties": 2 .。
编辑(地址选择白名单):
另一个选择是分别定义每个置换,如下所示:
{
"oneOf": [
{
"type": "object",
"properties": {
"key_name": { "const": "value1" },
"foo": { "type": "string" }
},
"required": ["key_name", "foo"],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"key_name": { "const": "value2" },
"bar": { "type": "string" }
},
"required": ["key_name", "bar"],
"additionalProperties": false
}
]
}https://stackoverflow.com/questions/61451539
复制相似问题