【问题标题】:Property has not been defined and the schema does not allow additional properties尚未定义属性,并且架构不允许其他属性
【发布时间】:2020-09-19 08:54:42
【问题描述】:

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

我正在尝试根据标头中的条件枚举值构建架构。属性“工资”类型需要根据标题中选择的条件而有所不同。

错误

尚未定义属性“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
        }
      }
    }
  ]
}

【问题讨论】:

  • 您不必在每个级别都添加 $schema 属性。这些都将被 draft7 实施忽略。
  • 好的,感谢您的反馈。

标签: json jsonschema


【解决方案1】:

问题

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

解决方案

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

补充说明

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

【讨论】:

  • 知道了。谢谢。就我而言,设置 additionalProperties: true 无济于事,因为它不会验证是否输入了任何不正确的属性。
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2018-11-03
  • 1970-01-01
  • 2016-02-23
  • 2015-05-06
  • 2017-07-06
  • 2019-09-02
相关资源
最近更新 更多