JSON 架构条件语句
JSON Schema Conditional Statements
我正在尝试验证我认为的简单 JSON 架构作为我的 Python 应用程序的配置文件,它是 header key/value 对的列表,唯一复杂的是,如果 'Type' 字段设置为 'AnyValue',则不需要值键。
这是架构的原样:
{
"definitions":
{
'KeyEntry':
{
"properties":
{
'Type': {"type" : "string"},
'Key': {"type": "string"}
},
"required": ['Type', 'Key'],
"anyOf":
[
{
"if":
{
"properties": {'Type': {"const": 'ExactValue'}}
},
"then":
{
"properties":
{
'Value': {"type": "string"}
},
"required": ['Type', 'Key', 'Value'],
"additionalProperties": false
}
},
{
"if":
{
"properties": {'Type': {"const": 'AnyValue'}}
},
"then":
{
"required": ['Type', 'Key'],
"additionalProperties": false
}
}
]
}
},
"type": "object",
"properties":
{
'Keys':
{
"type": "array",
"items": {"$ref": "#/definitions/KeyEntry"}
}
},
"required": ['Keys']
}
大多数验证都有效,除非我添加了额外的值,即使我在整个架构中设置了 "additionalProperties": false。
这是一个接受额外值的示例:
{
"Keys": [
{
"Type": "AnyValue",
"Key": "Version",
"Y": "Yes",
"N": "No",
}
]
}
请谁能帮我解释一下我哪里做错了,我应该如何改正?
additionalProperties
draft-07...
Validation with "additionalProperties" applies only to the child values of instance names that do not match any names in "properties", and do not match any regular expression in "patternProperties".
这意味着 additionalProperties
只知道出现在 properties
中或与 patternProperties
中的正则表达式匹配的关键字。在没有 properties
的情况下使用 additionalProperties
和 required
将创建一个无用的模式(没有任何东西会通过验证)。
相反,您可以将关注点分解为您真正想要的...
- 您希望类型、键和值都是字符串。
其中之一...
- 如果类型是 AnyValue,则只需要类型和键。
- 如果类型是 ExactValue,则需要类型、键和值。
这样也比较容易理解。这是 live demo with your data.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"KeyEntry": {
"properties": {
"Type": {
"type": "string"
},
"Key": {
"type": "string"
},
"Value": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Type",
"Key"
],
"anyOf": [
{
"if": {
"properties": {
"Type": {
"const": "ExactValue"
}
}
},
"then": {
"required": [
"Type",
"Key",
"Value"
]
},
"else": false
},
{
"if": {
"properties": {
"Type": {
"const": "AnyValue"
}
}
},
"then": {
"required": [
"Type",
"Key"
]
},
"else": false
}
]
}
},
"type": "object",
"properties": {
"Keys": {
"type": "array",
"items": {
"$ref": "#/definitions/KeyEntry"
}
}
},
"required": [
"Keys"
]
}
我正在尝试验证我认为的简单 JSON 架构作为我的 Python 应用程序的配置文件,它是 header key/value 对的列表,唯一复杂的是,如果 'Type' 字段设置为 'AnyValue',则不需要值键。
这是架构的原样:
{
"definitions":
{
'KeyEntry':
{
"properties":
{
'Type': {"type" : "string"},
'Key': {"type": "string"}
},
"required": ['Type', 'Key'],
"anyOf":
[
{
"if":
{
"properties": {'Type': {"const": 'ExactValue'}}
},
"then":
{
"properties":
{
'Value': {"type": "string"}
},
"required": ['Type', 'Key', 'Value'],
"additionalProperties": false
}
},
{
"if":
{
"properties": {'Type': {"const": 'AnyValue'}}
},
"then":
{
"required": ['Type', 'Key'],
"additionalProperties": false
}
}
]
}
},
"type": "object",
"properties":
{
'Keys':
{
"type": "array",
"items": {"$ref": "#/definitions/KeyEntry"}
}
},
"required": ['Keys']
}
大多数验证都有效,除非我添加了额外的值,即使我在整个架构中设置了 "additionalProperties": false。
这是一个接受额外值的示例:
{
"Keys": [
{
"Type": "AnyValue",
"Key": "Version",
"Y": "Yes",
"N": "No",
}
]
}
请谁能帮我解释一下我哪里做错了,我应该如何改正?
additionalProperties
draft-07...
Validation with "additionalProperties" applies only to the child values of instance names that do not match any names in "properties", and do not match any regular expression in "patternProperties".
这意味着 additionalProperties
只知道出现在 properties
中或与 patternProperties
中的正则表达式匹配的关键字。在没有 properties
的情况下使用 additionalProperties
和 required
将创建一个无用的模式(没有任何东西会通过验证)。
相反,您可以将关注点分解为您真正想要的...
- 您希望类型、键和值都是字符串。 其中之一...
- 如果类型是 AnyValue,则只需要类型和键。
- 如果类型是 ExactValue,则需要类型、键和值。
这样也比较容易理解。这是 live demo with your data.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"KeyEntry": {
"properties": {
"Type": {
"type": "string"
},
"Key": {
"type": "string"
},
"Value": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Type",
"Key"
],
"anyOf": [
{
"if": {
"properties": {
"Type": {
"const": "ExactValue"
}
}
},
"then": {
"required": [
"Type",
"Key",
"Value"
]
},
"else": false
},
{
"if": {
"properties": {
"Type": {
"const": "AnyValue"
}
}
},
"then": {
"required": [
"Type",
"Key"
]
},
"else": false
}
]
}
},
"type": "object",
"properties": {
"Keys": {
"type": "array",
"items": {
"$ref": "#/definitions/KeyEntry"
}
}
},
"required": [
"Keys"
]
}