我有一个json模式,它使用“ $ ref”(相对路径)引用另一个文件夹中存在的另一个json模式,并且出现“ MalformedURLException”。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/Base",
"definitions": {
"Base": {
"type": "object",
"additionalProperties": false,
"properties": {
"event": {
"$ref": "com/artifacts/click/ClickSchema.json"
},
"arrival_timestamp": {
"type": "integer",
"minimum": 0.0
}
},
"title": "Base"
}
}
}
另一个文件夹中的单击模式如下:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "com/artifacts/click/ClickSchema.json",
"Event": {
"type": "object",
"additionalProperties": false,
"properties": {
"sourceName": {
"type": "string"
}
}
}
}
有人可以帮忙吗?我正在使用this模式验证器。
答案 0 :(得分:1)
默认情况下,JSON模式对文件在文件中的位置一无所知,而对文件夹中的其他文件一无所知。
看起来您正在使用的库可以识别这一点,并建议您使用特殊的引用协议(classpath
)轻松定位文件夹中的其他文件:
https://github.com/everit-org/json-schema#loading-from-the-classpath
随着模式的增长,您将需要将其拆分为多个 源文件,并用“ $ ref”引用进行连接。如果你想 将模式存储在类路径中(而不是例如为它们提供服务) 通过HTTP),则推荐的方法是使用类路径: 使架构相互引用的协议。
这不是JSON模式定义的。
更常见的方法是加载要使用的所有模式,并允许在已有文件的地方进行本地解析。您正在使用的库也支持此功能:https://github.com/everit-org/json-schema#registering-schemas-by-uri
有时候,使用预加载的架构非常有用, 分配任意的URI(可能是uuid),而不是加载架构 通过URL。这可以通过以下方式将模式分配给URI来完成: 模式加载器的#registerSchemaByURI()方法。示例:
SchemaLoader schemaLoader = SchemaLoader.builder() .registerSchemaByURI(new URI("urn:uuid:a773c7a2-1a13-4f6a-a70d-694befe0ce63"), aJSONObject) .registerSchemaByURI(new URI("http://example.org"), otherJSONObject) .schemaJson(jsonSchema) .resolutionScope("classpath://my/schemas/directory/") .build();
如果您打算让其他人使用您的架构,则还有其他注意事项。如果是这样,请发表评论,然后我会展开。