【发布时间】:2021-03-06 19:42:26
【问题描述】:
当我引入条件 if / then 语句时,我想使用 json 模式将相对 JSON 指针引用与 $ref 模式结合起来。
在这种情况下,我想要求:
- 如果 system = Phone 则需要 usePhone 元素
- 如果 system = Email 则需要 useEmail 元素
当我使用模式进行验证时,模式正在生成错误 - 我怀疑 if -> $ref / enum 代码是问题的原因。 json-schema 文档建议在定义的元素内嵌套所需的常量/枚举值,但是当我的元素是 $ref 位置时,我不确定如何执行此操作,例如:
https://json-schema.org/understanding-json-schema/reference/conditionals.html
"if": {
"properties": { "country": { "const": "United States of America" } }
}
需要相对架构是因为 ContactPoint 的实例在组合架构中的多个位置使用。
参考资料:
- https://json-schema.org/understanding-json-schema/reference/conditionals.html
- https://docs.opis.io/json-schema/1.x/pointers.html
- https://docs.opis.io/json-schema/1.x/conditional-subschemas.html
- https://docs.opis.io/json-schema/1.x/ref-keyword.html
- https://docs.opis.io/json-schema/1.x/multiple-subschemas.html
例子:
谢谢!
{
"$schema": "http://json-schema.org/draft-07/schema#",
"id": "characteristic.entity.json",
"title": "characteristic.entity.schema.1.0",
"description": "Characteristic Objects Json Schema",
"definitions": {
"ContactPoint": {
"title": "ContactPoint",
"additionalProperties": true,
"properties": {
"id": {
"description": "",
"$ref": "primitive.entity.json#/definitions/string"
},
"type": {
"description": "The type of Contact.",
"enum": [
"Alternative",
"Primary"
]
},
"system": {
"description": "Telecommunications form for contact point - what communications system is required to make use of the contact.",
"enum": [
"Phone",
"Email",
"other"
]
},
"value": {
"description": "",
"$ref": "primitive.entity.json#/definitions/string"
},
"usePhone": {
"description": "Identifies the purpose of a Phone contact point.",
"enum": [
"Alternate",
"Business - Direct",
"Business - Main",
"Home",
"Mobile",
"Work"
]
},
"useEmail": {
"description": "Identifies the purpose of an Email contact point.",
"enum": [
"Person",
"Work",
"Business"
]
}
},
"allOf": [
{
"if": {
"$ref": "1/system",
"enum": [
"Phone"
]
},
"then": {
"required": [
"usePhone"
]
}
},
{
"if": {
"$ref": "1/system",
"enum": [
"Email"
]
},
"then": {
"required": [
"useEmail"
]
}
}
]
}
}
}
【问题讨论】:
-
两个初始的事情,看看你的问题是否得到解决。您需要为
$id使用完整的 URI。您不能将$ref与draft-07 或更早版本中的其他关键字一起使用。 (嗯,你可以,但所有其他关键字都被忽略/替换为新对象。我们在 2019-09 草案中“修复”了这个问题。)试试看你的问题是否得到解决。 -
@Relequestual 相对 ID 在
$id中应该没问题。但是,关键字拼写错误,因此模式解析器根本看不到它们:) -
没错。我需要记住 2020-11 年草案的变化!哈。对不起。
标签: json schema jsonschema python-jsonschema