使用jsonschema校验CycloneDX schema报hashes定义重复错误
问题原因
- 你使用的Node.js
jsonschema库对递归引用的JSON Schema兼容处理存在缺陷:CycloneDX 1.3 schema内部存在多处递归$ref引用,库在解析这些引用时会重复尝试注册#/properties/hashes片段,检测到定义冲突就抛出对应报错。 - 在线校验工具大多采用兼容性更好的Schema解析实现,对递归引用、重复片段的处理逻辑更完善,因此不会触发报错。
解决方法
方案1(推荐):替换为Ajv校验库
Ajv是目前Node.js生态兼容性最好、性能最优的JSON Schema校验库,完美支持CycloneDX schema的语法规则。
修改后的代码示例:
const fs = require("fs"); const Ajv = require("ajv"); const ajv = new Ajv(); const sbombJson = process.argv[3]; const testJson = process.argv[4]; const jsonSchemaValidator =(schema,test) =>{ const validate = ajv.compile(schema); const valid = validate(test); if (!valid) console.log(validate.errors); } const sbombSchema = JSON.parse(fs.readFileSync(sbombJson,'utf8')); const test = JSON.parse(fs.readFileSync(testJson,'utf8')); jsonSchemaValidator(sbombSchema,test);
执行前先安装依赖:npm install ajv
方案2:继续使用jsonschema库,添加覆盖配置
在校验方法中添加rewrite: true参数,允许库覆盖重复的schema缓存定义,即可规避冲突报错:
const jsonSchemaValitaor =(schema,test) =>{ // 新增rewrite参数允许覆盖已缓存的schema定义 console.log(validator.validate(test, schema, { rewrite: true }).errors); }
内容的提问来源于stack exchange,提问作者Gandi Loze
相关产品推荐
相关产品推荐

