如何引用另一个JSON Schema?

问题描述 投票:0回答:1

所以我有 2 个 JSON(为了便于理解而简化):

{
    "$schema":"https://json-schema.org/draft/2020-12/schema",
    "$id":"header.scm",
    "type":"object",
    "additionalProperties":false,
    "properties":{
        "id":{
            "type":"string",
            "pattern":"^[A-Z]*([0-9]{17})$"
        },
        "verb":{
            "type":"string",
            "enum":[
                "POST",
                "GET",
                "PUT",
                "PATCH",
                "DELETE"
            ]
        }
    },
    "required":[
        "id",
        "endpoint"
    ]
}
{
    "$schema":"https://json-schema.org/draft/2020-12/schema",
    "$id":"wms_mission.scm",
    "type":"object",
    "properties":{
        "header":{
            "$ref":"#C:/schemas/header.scm"
        },
        "body":{
            "additionalProperties":false,
            "type":"object",
            "properties":{
                "mission_id":{
                    "type":"string",
                    "pattern":"^(MISSION)([0-9]{17})$"
                },
                "command":{
                    "type":"string",
                    "enum":[
                        "CREATE",
            "CANCEL"
                    ]
                }
            },
            "required":[
                "mission_id",
                "command"
            ]
        }
    },
    "required":[
        "header",
        "body"
    ],
    "additionalProperties":false
}

此模式配置检查发送的消息是否具有标头和正文,并且两者都具有正确的配置。

一个例子:

{
    "body":{
        "mission_id":"EJ_1",
        "command":"CREATE",
        
    },
    "header":{
        "id":"EXAMPLE_ID001",
        "verb":"POST"
    }
}

问题是所有类型的消息的标题都是相同的,所以我想引用它。

如您所见,第二个文件使用绝对路径检查另一个文件中的标头配置。

但是,当我尝试验证架构时,我收到此错误消息:

Check that the format follows the schema (wms_mission.scm). [header: is missing but it is required, body: is missing but it is required]

我真的不明白我做错了什么。 我尝试使用相对路径,但我只遇到例外,或者它返回“正确”。

知道如何从 JSON 模式引用另一个 JSON 模式文件吗?

提前致谢!

json jsonschema
1个回答
0
投票

这实际上取决于所使用的实现。你用的是哪一款?

JSON 模式规范建议在验证过程中使用的所有模式应在验证之前可用。 https://json-schema.org/draft/2020-12/draft-bhutton-json-schema-01#section-9

大多数实现都能够在验证之前“注册”或“加载”模式

正确引用其他模式是直接使用其他模式的

$id
。如果您为每个模式定义了不同的基本 uri,则基本 URI 解析存在一些微妙之处。在您的示例中,您似乎没有这样做。

{
    "$schema":"https://json-schema.org/draft/2020-12/schema",
    "$id":"wms_mission.scm",
    "type":"object",
    "properties":{
        "header":{
            "$ref": "header.scm"
        },
        "body":{
            "additionalProperties":false,
            "type":"object",
            "properties":{
                "mission_id":{
                    "type":"string",
                    "pattern":"^(MISSION)([0-9]{17})$"
                },
                "command":{
                    "type":"string",
                    "enum":[
                        "CREATE",
            "CANCEL"
                    ]
                }
            },
            "required":[
                "mission_id",
                "command"
            ]
        }
    },
    "required":[
        "header",
        "body"
    ],
    "additionalProperties":false
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.