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

如何验证含$ref的JSON Schema对应的JSON Pointer有效性?

验证JSON Schema中的JSON Pointer有效性(含$ref引用处理)

核心思路

要仅通过product.schema.json完成JSON Pointer验证,核心是先解析并递归处理Schema中的$ref引用,把外部geographical-location.schema.json的结构合并到主Schema对应位置,再按路径遍历检查每个节点是否存在。

具体实现步骤

1. 加载主Schema及依赖的外部Schema

  • 读取product.schema.json并解析为JSON对象
  • 遍历主Schema,识别所有指向geographical-location.schema.json的$ref字段,读取并解析该外部Schema文件(注意相对路径要基于主Schema的文件位置定位)

2. 替换$ref为实际结构

  • 递归遍历主Schema的每个节点:
    • 遇到$ref字段时,将该节点替换为$ref指向的外部Schema完整结构
    • 若外部Schema中还有嵌套$ref,需重复上述替换逻辑
  • 示例:主Schema中warehouseLocation字段若为{"$ref": "./geographical-location.schema.json"},替换后会直接变成包含longitude、latitude等属性的完整对象结构

3. 验证JSON Pointer有效性

  • 将待验证的JSON Pointer按/分割为路径片段(比如/dimensions/length分割为["dimensions", "length"])
  • 从合并后的完整Schema根节点开始,依次匹配每个路径片段:
    • 当前节点是对象时,检查是否存在对应属性
    • 当前节点是数组类型(Schema中type: array)时,需确认片段是合法整数索引,且数组items定义包含后续路径
    • 任意一步找不到对应节点则该Pointer无效,全部匹配则有效

示例验证逻辑

假设合并后的完整Schema简化结构如下:

{
  "type": "object",
  "properties": {
    "dimensions": {
      "type": "object",
      "properties": {
        "length": {"type": "number"}
      }
    },
    "warehouseLocation": {
      "type": "object",
      "properties": {
        "longitude": {"type": "number"},
        "latitude": {"type": "number"}
      }
    }
  }
}
  • /dimensions/length:依次匹配dimensions→length,路径存在,有效
  • /warehouseLocation/longitude:依次匹配warehouseLocation→longitude,路径存在,有效
  • /dimensions/mass:dimensions下无mass属性,路径不存在,无效

注意事项

  • 处理$ref时要记录已加载的Schema路径,避免循环引用导致无限递归
  • 若Schema使用allOf/anyOf/oneOf等组合关键字,需合并这些关键字下的所有Schema结构后再验证路径
  • 若对象的additionalProperties设为true,未定义的属性路径会被视为有效,需根据业务需求调整验证规则

内容的提问来源于stack exchange,提问作者Juan Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:18:14