1

当我引入条件 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 的实例在组合模式中的多个位置使用。

参考:

例子:

谢谢!

{
    "$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"
                        ]
                    }
                }
            ]
        }
    }
}
4

1 回答 1

0

"id"将您的关键字更改为"$id"-- 在 JSON Schema Draft 4 之后更改了该关键字的名称。

正如@Relequestual 所说,您不能$ref在草稿 7 或更早版本中使用同级关键字,因此您应该将$ref( allOfie "allOf": [ { "$ref": ... } ].

如果您使用的是 draft-2019-09,您应该重命名definitions$defs.

此外,您不能在 中使用相对 JSON 指针$ref,因此 ref like"1/system"不会解析任何内容(鉴于您在此处发布的内容)。因此,将该 ref 更改为#/definitions/ContactPoint/properties/system,它应该在模式中找到正确的位置。

于 2020-11-24T17:31:05.760 回答