AJV校验含斜杠属性名时错误路径显示~1,如何改为原路径?
解决AJV校验错误信息中斜杠被转义为~1的问题
当对象属性名包含斜杠(/)时,AJV默认会遵循JSON Pointer规范将斜杠转义为~1,导致错误信息里的属性路径显示不符合预期。要让错误信息展示真实的属性路径,可通过以下两种方式处理:
自定义错误格式化函数
AJV提供formatError配置项,允许自定义错误信息的生成逻辑。我们可以在这个函数里把路径中的~1替换回/,还原真实属性名。
示例代码:
const Ajv = require('ajv'); const ajv = new Ajv({ formatError: (error) => { if (error.instancePath) { // 全局替换路径中的~1为/ error.instancePath = error.instancePath.replace(/~1/g, '/'); } return `${error.instancePath} ${error.message}`; } }); // 定义校验Schema const schema = { type: 'object', properties: { 'abc/def': { type: 'object', properties: { a: { type: 'string' }, c: { type: 'integer' } } } } }; const validate = ajv.compile(schema); const data = { 'abc/def': { a: 'b', c: 'd' } }; const valid = validate(data); if (!valid) { console.log(validate.errors[0].message); // 输出:/abc/def/c must be integer }
关闭JSON Pointer转义(需确认版本兼容性)
部分AJV版本支持通过jsonPointers: false配置关闭JSON Pointer的路径转义逻辑,错误信息会直接使用原始属性名生成路径。
示例代码:
const Ajv = require('ajv'); const ajv = new Ajv({ jsonPointers: false }); // 后续Schema定义、校验逻辑与上述示例一致 // 错误信息将直接显示:/abc/def/c must be integer
注意事项
- 自定义格式化函数的方式兼容性更强,不受AJV版本限制,还能灵活调整错误信息的整体格式
- 关闭JSON Pointer转义的方式需要确认当前使用的AJV版本是否支持该配置,部分旧版本可能没有此选项
内容的提问来源于stack exchange,提问作者Stackboi
相关产品推荐
相关产品推荐

