如何验证含$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
相关产品推荐
相关产品推荐

