尚未定义属性,并且架构不允许其他属性

时间:2020-06-01 04:32:16

标签: json jsonschema

尝试验证架构-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
        }
      }
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

问题

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

解决方案

已经在子模式的properties中引入了“ salary”属性,其中也定义了additionalProperties: false。至少与简单的布尔模式true一样。 在其他情况下,也可以包含同时出现在thenelse关键字中的所有通用属性,以减少重复,但是在您的特定情况下,这几乎是不可行的。

附加说明

一般来说,if / then / else仅应用于其他约束条件(例如minimum / maximum / required)但不要引入全新的properties,尤其是在使用patternPropertiesadditionalProperties时。