我正在尝试为现有的JSON数据文件构建JSON模式(draft-06)。架构已经变得很大,以适应单个文件,我试图将其分解为多个文件。但是我一直收到错误can't resovle refrence sectionTableSchema.txt from id http://somesite/section
我制作了以下文件并将它们放在同一目录中。这些文件不托管在网络服务器上。
settingsSchema.txt:
{
"title":"Settings",
"$schema":"http://json-schema.org/draft-06/schema#",
"$id":"http://somesite/settingsSchema.txt",
"properties":{
"section":{
...
...
...
"$id":"/section",
"items":{
"oneOf":[
{"$ref":"#/sectionTableSchema.txt"},
{"$ref":"#/sectionNonTableSchema.txt"}
]
},
"type":"array"
}
},
"type":"object"
}
sectionTableSchema.txt
{
"$schema":"http://json-schema.org/draft-06/schema#",
"$id":"http://somesite/sectionTableSchema.txt",
"definitions":{},
"properties":{
....
....
....
}
"type":"object"
}
我认为我的一部分问题是我不了解$id
和$ref
关键字,足以了解绝对uri,相对uri,json-pointers等之间的情况。
答案 0 :(得分:0)
在OP的示例中,"$ref":"#/sectionTableSchema.txt"
的意思是“在当前模式文件中,从根元素获取名为sectionTableSchema.txt
的JSON属性”。
$ref
可以分为两个部分:
$ref
从“#”符号开始,因此不提供架构文件的URI,则意味着您要从当前文件中提取架构。可以在documentation中找到相同的信息。
据我了解, JSON模式草稿说,您可以为模式文件指定有效的URI。但是URI不能是相对的,因此没有标准定义的方法来引用具有相对路径的文件。但是,在实践中,许多工具提供了执行此功能的能力,尽管它们不是标准的一部分,并且可能因工具而异。
在AJV 中,您可以将引用写为"$ref":"ANY-ID-YOU-WANT"
并使用ajv.addSchema(schemaJson, 'ANY-ID-YOU-WANT')
方法,其中schemaJson
是具有require
'd { {1}}内容。