JSON Schema嵌套引用验证:子目录Schema无法解析
解决jsonvalidate嵌套引用路径解析错误的问题
问题原因
你遇到的错误是因为JSON Schema的相对引用解析基准路径逻辑导致的:
addressschema位于root/schemas/sub-schemas/目录下,它默认的引用解析基准是自身所在目录- 当你在
address里写$ref: "sub-schemas/city"时,解析器会尝试查找root/schemas/sub-schemas/sub-schemas/city,而非正确的root/schemas/sub-schemas/city,因此找不到目标schema。
解决方案
1. 修正相对引用路径
直接将address里的引用改为同目录相对路径:
// address.json { // 其他schema定义 "$ref": "./city" // 若文件名带后缀,可写为"./city.json" }
修改后,解析器会从address所在的sub-schemas/目录下查找city schema,路径匹配正确。
2. 给每个Schema设置$id属性
为每个schema指定绝对路径的$id,明确引用基准:
// user.json { "$id": "file:///your/absolute/path/root/schemas/user", "$ref": "sub-schemas/address" // 相对于user的$id路径,指向sub-schemas/address } // address.json { "$id": "file:///your/absolute/path/root/schemas/sub-schemas/address", "$ref": "./city" // 相对于address的$id路径,指向同目录的city } // city.json { "$id": "file:///your/absolute/path/root/schemas/sub-schemas/city", // 你的city schema定义 }
3. 调用json_validate时指定base_url
验证时统一设置所有引用的基准路径为schemas目录的绝对路径:
library(jsonvalidate) # 读取待验证数据和主schema target_data <- jsonlite::read_json("path/to/your/data.json") user_schema <- jsonlite::read_json("root/schemas/user.json") # 验证时指定base_url json_validate( target_data, user_schema, base_url = "file:///absolute/path/to/root/schemas/", engine = "ajv" // 明确指定ajv引擎,确保解析逻辑一致 )
若你的R工作目录就是root,也可使用相对路径的base_url:"file://./schemas/"
验证测试
修改完成后重新运行验证代码,嵌套引用即可正常解析,不会再出现路径错误。
内容的提问来源于stack exchange,提问作者Duccio A
相关产品推荐
相关产品推荐

