属性 尚未定义,架构不允许附加属性

Property has not been defined and the schema does not allow additional properties

我在尝试验证架构时遇到以下错误 - v7 草案。感谢您帮助解决此错误。

我正在尝试根据 header 中的条件枚举值构建架构。属性 'salary' 类型需要根据在 header.

中选择的条件而变化

错误

属性 'salary' 尚未定义,架构不允许附加属性。

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
        }
      }
    }
  ]
}

问题

additionalProperties 关键字仅考虑在它出现的直接子模式中定义的 propertiespatternProperties。由于您仅在 thenelse 关键字中定义了“薪水”属性,因此它被视为非法附加 属性.

解决方案

已经在子模式的 properties 中引入了“薪水”属性,其中还定义了 additionalProperties: false。至少作为简单的布尔模式 true。 在其他情况下,也可以包括出现在 thenelse 关键字中的所有常见属性以减少重复,但在您的特定情况下,这几乎不是一个选项。

补充说明

一般来说,if/then/else 应该只用于附加约束(例如 minimum/maximum/required) 但不要引入全新的 properties 尤其是在使用 patternPropertiesadditionalProperties.