json - 将组合架构用作父架构时:无法解析架构引用“#foo”。路径'not.allOf[0]'
问题描述
考虑https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft6/ref.json#L414中的一个示例
原始架构是:
{
"allOf": [{
"$ref": "http://localhost:1234/bar#foo"
}],
"definitions": {
"A": {
"$id": "http://localhost:1234/bar#foo",
"type": "integer"
}
}
}
这是有效的。
对于这个模式 S,如果我想通过在这个模式之外添加一个组合模式来创建一个新模式,比如:{"not":S}
,即:
{
"not": {
"allOf": [{
"$ref": "http://localhost:1234/bar#foo"
}],
"definitions": {
"A": {
"$id": "http://localhost:1234/bar#foo",
"type": "integer"
}
}
}
}
使用具有绝对 URI 的与位置无关的标识符,也使用$id
. 但它是无效的。
错误消息(使用https://www.jsonschemavalidator.net/):
Error parsing schema
Message:
Error when resolving schema reference 'http://localhost:1234/bar#foo'. Path 'not.allOf[0]', line 3, position 20.
一个类似的例子是:
{
"not": {
"allOf": [{
"$ref": "#foo"
}],
"definitions": {
"A": {
"$id": "#foo",
"type": "integer"
}
}
}
}
与位置无关的标识符,也是无效的。
$ref
如果同时存在并且添加父模式后,我无法弄清楚为什么它是无效$id
的......
这里{"not":S}
只是一种可能,也可以考虑{"anyOf":[{S}]}
。
我知道它$id
声明了一个基础 URI,$ref URI-references 是根据它解析的。
但是上述模式有什么问题?我应该如何纠正它们?
如果有人帮助我,我将不胜感激...
解决方案
你在这里是正确的,你的架构是正确的。我将其称为实现中的错误。
您的架构适用于 JSON Schema draft-07
,但不适用于 JSON Schema 草稿2019-09
或更高版本。对于2019-09
及以上,您的$id
值不能包含非空片段。
您可以在另一个基于 Web 的验证器(HyperJump 验证器的基于 Web 的版本)上看到正确和有效的行为:https ://json-schema.hyperjump.io
$schema
此基于 Web 的实现默认为最新(2020-12),但您可以使用(例如)指定草稿版本"$schema": "http://json-schema.org/draft-07/schema#"
。
要在 HyperJump 上查看此功能,请修改您的架构以删除标识符 URI 中的片段,或者指定您正在使用draft-07
.
推荐阅读
- eclipse-plugin - 有没有办法找到内部类的移动位置
- oracle - 为什么我的 TKPROF 文件不显示我的 PL/SQL 块的提取计数?
- python - ImportError: No module named ...(但我有 __init__.py 文件并设置了 PYTHONPATH)
- php - 卡住的查询
- sql - 查询执行时间过长
- java - 如何在嵌套的 onclick 方法(android)中获取动态数组值?
- javascript - Document.selector.innerHTML 仅在刷新页面后有效
- flutter - Fluttter 作为 Root 页面导航到页面
- amazon-dynamodb - Appsync“批量创建”解析器给出“映射模板”错误
- azure - azure front door - 为什么我们需要向后端池添加多个后端