我需要通过以下方式验证JSON文件:
const setupSchema = fs.readFileSync(schemaDir +'/setup.json');
并编译:
const setupValidator = ajv.compile(setupSchema);
我的问题是那条线:
console.log( setupValidator('') );
总是返回true
,即使验证者的参数是空字符串也是如此。我想加载的方式不好,但是...需要问比我聪明的人。
答案 0 :(得分:2)
从快速入门指南中:(http://json-schema.org/)
正在验证或描述的JSON文档称为实例, 包含描述的文档称为架构。
最基本的架构是一个空白的JSON对象,它会限制 什么也没有,什么也不允许,什么也没有描述:
{}
您可以通过添加验证关键字将约束应用于实例 模式。例如,“ type”关键字可用于限制 对象,数组,字符串,数字,布尔值或null的实例:
{ "type": "string" }
这意味着,如果您的架构是空对象或不使用JSON架构词汇表,则Ajv的compile
函数将始终生成始终通过的验证函数:
var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true});
var schema = {
foo: 'bar',
bar: 'baz',
baz: 'baz'
};
var validate = ajv.compile(schema);
validate({answer: 42}); //=> true
validate('42'); //=> true
validate(42); //=> true
也许您的setup.json
加载不正确或不是根据JSON Schema规范的模式。
答案 1 :(得分:1)
// You should specify encoding while reading the file otherwise it will return raw buffer
const setupSchema = fs.readFileSync(schemaDir +'/setup.json', "utf-8");
// setupSchema is a JSON string, so you need to parse it before passing it to compile as compile function accepts an object
const setupValidator = ajv.compile(JSON.parse(setupSchema));
console.log( setupValidator('') ) // Now, this will return false;
您可以仅使用require
来获取json文件,而不是执行上述操作。
const setupSchema = require(schemaDir +'/setup.json');
const setupValidator = ajv.compile(setupSchema);
console.log( setupValidator('') );