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 中,则只会显示类型的描述,而不显示实际字段的描述。如果类型描述为空,则不使用字段描述。我尝试以一种方式组合 title
和 description
,即从通用定义中使用标题,从字段描述中使用描述。似乎总是使用通用类型定义中的标题和描述。我怎么能使用通用类型和字段的描述,说明这个字段实际上是什么。
其次,如果 description 是从 definitions 继承的,我可以只使用 common pattern
或任何其他类型 属性,并引用在 definitions 或其他地方以某种方式定义的模式吗?
为了回答你的问题,首先要考虑JSON Schema 没有继承,只有引用。
对于 draft-04,使用引用意味着整个子模式对象被引用的模式对象替换。这意味着您更具体的字段描述丢失了。 (您可以将它们包装在 allOf
中,但就生成文档而言,它可能无法满足您的要求)。
如果您可以转到 2019-09 草案,$ref
可以与其他关键字一起使用,因为它随后被归类为应用程序关键字。不过,我不知道您使用的工具是否会像您期望的那样工作。
就您的第二个问题而言,未内置于 JSON 架构中。 $ref
引用只能在您有架构(或子架构)时使用。如果您想删除不是模式的公共部分,一种常见的方法是使用模板引擎并在构建或运行时编译您的模式。我已经看到使用 jsonnet 大规模完成此操作。
我可以有通用类型限制或新类型吗,我可以将其用于 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 中,则只会显示类型的描述,而不显示实际字段的描述。如果类型描述为空,则不使用字段描述。我尝试以一种方式组合 title
和 description
,即从通用定义中使用标题,从字段描述中使用描述。似乎总是使用通用类型定义中的标题和描述。我怎么能使用通用类型和字段的描述,说明这个字段实际上是什么。
其次,如果 description 是从 definitions 继承的,我可以只使用 common pattern
或任何其他类型 属性,并引用在 definitions 或其他地方以某种方式定义的模式吗?
为了回答你的问题,首先要考虑JSON Schema 没有继承,只有引用。
对于 draft-04,使用引用意味着整个子模式对象被引用的模式对象替换。这意味着您更具体的字段描述丢失了。 (您可以将它们包装在 allOf
中,但就生成文档而言,它可能无法满足您的要求)。
如果您可以转到 2019-09 草案,$ref
可以与其他关键字一起使用,因为它随后被归类为应用程序关键字。不过,我不知道您使用的工具是否会像您期望的那样工作。
就您的第二个问题而言,未内置于 JSON 架构中。 $ref
引用只能在您有架构(或子架构)时使用。如果您想删除不是模式的公共部分,一种常见的方法是使用模板引擎并在构建或运行时编译您的模式。我已经看到使用 jsonnet 大规模完成此操作。