我可以有常见的类型限制或一个新的类型,我可以在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"
}
}
}
在呈现的模式中,我有两个带有一些限制(enum、pattern等)的字符串。我不想在每一个这类领域重复这些限制。因此,我在定义中定义了它们并重用了它们。如果类型约束改变,我只改变定义。
然而,我有两个问题。
首先,复制description
。如果将其加载到XMLSpy中,则只显示类型的描述,而不显示实际字段的描述。如果类型的描述为空,则不使用description of field。我尝试将title
和description
结合在一起,以便从共同定义中使用标题,并从字段描述中使用描述。似乎总是使用标题和描述从共同的类型定义。我如何使用公共类型和字段的描述,它告诉我们这个字段实际上是什么。
第二,如果描述是从定义继承的,我可以只使用常见的pattern
或任何其他类型属性,并引用在定义或其他地方以某种方式定义的模式吗?
为了回答你的问题,首先考虑JSON Schema没有继承,只有引用。
对于draft-04,使用引用意味着WHOLE子模式对象被引用的模式对象替换。这意味着丢失了更具体的字段描述。(您可以将它们包装在allOf
中,但它可能不会像您想要的那样生成文档)。
如果您可以移动到2019-09草案,$ref
可以与其他关键字一起使用,因为它随后被归类为应用程序关键字。我不知道你使用的工具是否会像你期望的那样工作。
关于你的第二个问题,没有内置到JSON Schema中。$ref
引用只能在有模式(或子模式)时使用。如果您希望对非模式的公共部分进行重复删除,一种常见的方法是使用模板引擎并在构建或运行时编译模式。我曾在jsonnet中大规模地看到过这种情况。