You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON Schema嵌套引用验证:子目录Schema无法解析

解决jsonvalidate嵌套引用路径解析错误的问题

问题原因

你遇到的错误是因为JSON Schema的相对引用解析基准路径逻辑导致的:

  • address schema位于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:12:18