如何在JSON Schema中验证文件路径是否存在?
JSON Schema如何验证文件路径是否存在?
我正在编写JSON Schema,希望添加一个接收文件路径的字段,能否像$schema字段找不到Schema文件时显示错误那样,验证该文件路径是否存在?以下是我当前的Schema代码:
{ "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "file": { "type": "string", "pattern": "^(\\./|\\.\\./|https?://).*\\.json$", "description": "The path to another json file." } } }
在实际使用时,若填写的文件不存在,希望能显示警告或错误,示例如下:
{ "file": "../path/to/file.json" }
解答
首先明确:JSON Schema本身是纯数据结构验证标准,只负责校验数据的格式、类型、规则,不支持直接访问文件系统来验证路径是否存在。$schema字段的报错是JSON Schema解析器自身加载Schema文件时的行为,不属于Schema规则能定义的范畴。
要实现文件路径存在性验证,得靠额外的逻辑扩展,常见方案有两种:
1. 给JSON Schema验证工具添加自定义关键字
比如使用主流的验证库,可以自定义一个fileExists关键字,在验证函数里编写文件系统检查逻辑。示例代码如下:
const Ajv = require('ajv'); const fs = require('fs'); const path = require('path'); const ajv = new Ajv(); // 自定义fileExists关键字 ajv.addKeyword('fileExists', { type: 'string', validate: function(schema, data) { // 处理相对路径,以当前工作目录为基准 const filePath = path.resolve(data); return fs.existsSync(filePath); }, errorMessage: '指定的文件路径不存在' }); // 你的Schema const schema = { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "file": { "type": "string", "pattern": "^(\\./|\\.\\./|https?://).*\\.json$", "fileExists": true, "description": "The path to another json file." } } }; // 待验证的数据 const data = { "file": "../path/to/file.json" }; const validate = ajv.compile(schema); const valid = validate(data); if (!valid) console.log(validate.errors);
2. 在IDE中实现实时验证提示
如果是想在IDE(如VS Code)里获得类似$schema的实时错误提示,需要编写IDE扩展或者使用支持自定义验证的插件,将文件存在性检查的逻辑集成到IDE的JSON验证流程中。这类扩展可以监听JSON文件的变化,实时检查file字段对应的路径是否存在,并在编辑器中显示错误提示。
补充说明
你当前Schema中的pattern只能校验路径的格式是否符合要求(比如相对路径或HTTP URL、后缀为json),但无法验证文件实际是否存在,必须结合上述的额外逻辑才能实现需求。
内容的提问来源于stack exchange,提问作者Get Off My Lawn
相关产品推荐
相关产品推荐

