用特定值覆盖 "inherited" JSON 属性

Override a "inherited" JSON property with a specific value

考虑以下示例架构:

"Foo": {
      "type": "object",
      "properties": {
        "num": {
          "type": "integer",
          "minimum": 1,
          "maximum": 64
        }
  }

"Bla": {
      "type": "object",
      "properties": {
        "base": {
          "type": "object",
          "allOf" : [
            {"$ref": "#/definitions/Foo"},
            {"num" : {"enum" : [64]} }
          ]
        }
      }

我想要实现的是将继承的 属性 "num" 的值限制为仅 64 而不是 1 到 64 之间的任何值。 有办法实现吗?
例如,我希望它验证:

"Bla" : {
"base" : {"num" : 64}
}

但不是这个

"Bla" : {
"base" : {"num" : 32}
}

为了完整起见,提供我之前的评论作为答案:

  1. 如果您将 ”num” 包裹在 allOf 中,再包裹在另一个 properties 中,您应该已经实现了您想要的效果。
  2. 此外,您可能希望使用 "const": 64 而不是 "enum": [64] – 以提高可读性。
  3. 如果您可以随意使用最新的 Draft 2019-09,您甚至可以避免使用 allOf,因为 $ref 可以与其他关键字一起使用,结果如下:
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",

...

  "$defs": {
    "Foo": {
      "type": "object",
      "properties": {
        "num": {
          "type": "integer",
          "minimum": 1,
          "maximum": 64
        }
      }
    },
    "Bla": {
      "type": "object",
      "properties": {
        "base": {
          "$ref": "#/$defs/Foo",
          "type": "object",
          "properties": {
            "num": {
              "const" : 64
            }
          }
        }
      }
    }
  }
}