所以我有 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 模式规范建议在验证过程中使用的所有模式应在验证之前可用。 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
}