JSON 模式中的常见类型限制

Common type restrictions in JSON schema

我可以有通用类型限制或新类型吗,我可以将其用于 JSON 架构中的更多属性?我正在引用一些类型属性,但我没有得到我想要的。例如:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Common types",
    "definitions": {
        "YN": {
            "description": "Y or N field (can be empty, too)",
            "type": "string",
            "minLength": 0,
            "maxLength": 1,
            "enum": [ "Y", "N", "" ]
        },
        "HHMM": {
            "description": "Time in HHMM format (or empty).",
            "type": "string",
            "minLength": 0,
            "maxLength": 4,
            "pattern": "^[0-2][0-9][0-5][0-9]$|^$"
        }
    },
    "properties" : {
        "is_registered": {
            "description": "User registered. (this description is overriden)",
            "$ref": "#/definitions/YN"
        },
        "is_valid": {
            "description": "User valid. (this description is overriden)",
            "$ref": "#/definitions/YN"
        },
        "timeofday": {
            "description": "User registered at HHMM. (this description is overriden)",
            "$ref": "#/definitions/HHMM"
        }
    }
}

在提供的模式中,我有两个字符串,但有一些限制(枚举、模式等)。我不想在此类的每个字段中重复这些限制。因此,我在定义中定义了它们并重复使用它们。如果类型约束发生变化,我只更改定义。

但是,我有两个问题。

首先,description被复制了。如果我将其加载到 XMLSpy 中,则只会显示类型的描述,而不显示实际字段的描述。如果类型描述为空,则不使用字段描述。我尝试以一种方式组合 titledescription,即从通用定义中使用标题,从字段描述中使用描述。似乎总是使用通用类型定义中的标题和描述。我怎么能使用通用类型和字段的描述,说明这个字段实际上是什么。

其次,如果 description 是从 definitions 继承的,我可以只使用 common pattern 或任何其他类型 属性,并引用在 definitions 或其他地方以某种方式定义的模式吗?

为了回答你的问题,首先要考虑JSON Schema 没有继承,只有引用。

对于 draft-04,使用引用意味着整个子模式对象被引用的模式对象替换。这意味着您更具体的字段描述丢失了。 (您可以将它们包装在 allOf 中,但就生成文档而言,它可能无法满足您的要求)。

如果您可以转到 2019-09 草案,$ref 可以与其他关键字一起使用,因为它随后被归类为应用程序关键字。不过,我不知道您使用的工具是否会像您期望的那样工作。

就您的第二个问题而言,未内置于 JSON 架构中。 $ref 引用只能在您有架构(或子架构)时使用。如果您想删除不是模式的公共部分,一种常见的方法是使用模板引擎并在构建或运行时编译您的模式。我已经看到使用 jsonnet 大规模完成此操作。