尝试验证架构-v7草案时出现以下错误。感谢您在解决此错误方面的帮助。
我正在尝试根据标头中的条件枚举值构建模式。 “工资”属性的类型需要根据标题中选择的条件而有所不同。
错误
尚未定义属性“工资”,并且该架构不允许其他属性。
JSON模式
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"EmployeeHeader": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"empType": {
"type": "string",
"enum": [
"FULLTIME",
"CONTRACT"
]
}
},
"required": [
"empType"
]
},
"EmployeeDetail": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"workInfo": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"jobtitle": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"jobtitle"
],
"additionalProperties": false
}
},
"required": [
"workInfo"
],
"additionalProperties": false
},
"minItems": 1
}
},
"if": {
"properties": {
"EmployeeHeader": {
"properties": {
"empType": {
"const": "FULLTIME"
}
}
}
}
},
"then": {
"properties": {
"EmployeeDetail": {
"items": {
"properties": {
"workInfo": {
"properties": {
"salary": {
"type": "object",
"properties": {
"regular": {
"type": "number",
"minimum": 0,
"maximum": 1000000,
"exclusiveMaximum": false,
"multipleOf": 0.01
},
"bonus": {
"type": "number",
"minimum": 0,
"maximum": 1000000,
"exclusiveMaximum": false,
"multipleOf": 0.01
}
}
}
}
}
}
}
}
}
},
"else": {
"properties": {
"EmployeeDetail": {
"items": {
"properties": {
"workInfo": {
"properties": {
"salary": {
"type": "number",
"minimum": 0,
"maximum": 1000000,
"exclusiveMaximum": false,
"multipleOf": 0.01
}
}
}
}
}
}
}
},
"required": [
"EmployeeHeader",
"EmployeeDetail"
],
"additionalProperties": false
}
样品有效载荷
{
"EmployeeHeader": {
"empType": "FULLTIME"
},
"EmployeeDetail": [
{
"workInfo": {
"jobtitle": "Software Engineer",
"salary": {
"regular": 4000,
"bonus": 5000
}
}
}
]
}
答案 0 :(得分:0)
additionalProperties
关键字仅考虑在出现的直接子模式中定义的properties
和patternProperties
。由于您仅在then
和else
关键字中定义了“工资”属性,因此将其视为非法的附加属性。
已经在子模式的properties
中引入了“ salary”属性,其中也定义了additionalProperties: false
。至少与简单的布尔模式true
一样。
在其他情况下,也可以包含同时出现在then
和else
关键字中的所有通用属性,以减少重复,但是在您的特定情况下,这几乎是不可行的。
一般来说,if
/ then
/ else
仅应用于其他约束条件(例如minimum
/ maximum
/ required
)但不要引入全新的properties
,尤其是在使用patternProperties
或additionalProperties
时。