元模式指定所有属性的必需属性

时间:2018-07-03 18:17:37

标签: json jsonschema

我想自定义一个元模式,以便要求所有属性都具有附加属性,例如,我如何要求所有属性都指定一个"type"

然后此架构应失败:

{
    "$schema": "http://json-schema.org/schema#",
    "title": "...",
    "description": "...",
    "type": "object",
    "properties": {
        "name": {
            "description": "..."
        }
    }
}

但是这个应该成功:

{
    "$schema": "http://json-schema.org/schema#",
    "title": "...",
    "description": "...",
    "type": "object",
    "properties": {
        "name": {
            "description": "...",
            "type": "string"
        }
    }
}

1 个答案:

答案 0 :(得分:2)

不幸的是,编写元方案并不容易。它正在开发中,但是还没有好的解决方案。

您必须复制要扩展的元模式,然后添加"required": ["type"]

但是,当我们在这里时,也许我可以说服您不要这样做。在某些情况下,使type为关键字会导致问题。这里有一些例子。 https://github.com/json-schema/json-schema/issues/172#issuecomment-124214534

编辑

在进一步讨论之后,我们发现此特殊情况不存在扩展元模式通常遇到的问题,因为它不需要递归。这是一个扩展拔模06架构以包括名为custom的新关键字的示例,该关键字是布尔值,仅在properties架构的顶层才需要。

{
  "allOf": [
    { "$ref": "http://json-schema.org/draft-06/schema#" },
    {
      "properties": {
        "properties": {
          "patternProperties": {
            ".*": {
              "properties": {
                "custom": { "type": "boolean" }
              },
              "required": ["custom"]
            }
          }
        }
      }
    }
  ]
}

这是符合此元模式的示例架构。

{
  "properties": {
    "foo": {
      "custom": true,
      "not": { "type": "string" }
    }
  }
}

“ {foo}”架构要求使用custom关键字,而not架构或顶级架构则不需要。