如何校验数据结构,一般情况下,我们应该考虑现成的轮子。
以下是几个常见的 JavaScript JSON Schema Library:
这些库都可以用于校验和验证 JSON 数据结构。
这些库的主要区别在于其性能、功能和 API 设计方面。以下是一些关键区别:
每个库都有其独特的优点和适用场景,具体取决于您的需求和项目的要求。
以下是每个库的示例:
ajv:
const Ajv = require("ajv");
const ajv = new Ajv(); // options can be passed, e.g. {allErrors: true}
const schema = {
type: "object",
properties: {
foo: {type: "integer"},
bar: {type: "string"},
},
required: ["foo"],
additionalProperties: false,
};
const validate = ajv.compile(schema);
const data = {foo: 1, bar: "abc"};
const valid = validate(data);
console.log(valid); // true
jsonschema:
const Validator = require('jsonschema').Validator;
const v = new Validator();
const schema = {
"id": "/SimplePerson",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0, "maximum": 150},
"isStudent": {"type": "boolean"},
"address": {"$ref": "/SimpleAddress"}
}
};
const instance = {
"name": "John Smith",
"age": 34,
"isStudent": false,
"address": {
"streetAddress": "123 Main St.",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
};
v.addSchema(schema, '/SimplePerson');
const validation = v.validate(instance, schema);
console.log(validation.valid); // true
joi:
const Joi = require('joi');
const schema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.max(30)
.required(),
password: Joi.string()
.pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
repeat_password: Joi.ref('password'),
access_token: [Joi.string(), Joi.number()],
birth_year: Joi.number()
.integer()
.min(1900)
.max(2013),
email: Joi.string()
.email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
});
const data = {
username: 'abc',
birth_year: 1994,
email: 'abc@example.com'
};
const result = schema.validate(data);
console.log(result);
z-schema:
const ZSchema = require("z-schema");
const validator = new ZSchema();
const schema = {
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'integer' }
},
required: ['name', 'age']
};
const data = {
name: 'John',
age: 25
};
const valid = validator.validate(data, schema);
console.log(valid); // true
一般情况下,如果要尝试的话,我建议在ajv和joi中进行选择。
ajv和joi是两个常见的JavaScript JSON Schema 库,它们在社区生态、用法和API设计方面都有一些区别。以下是它们之间的比较:
社区生态
用法
API设计
总的来说,ajv和joi都是非常流行的JSON Schema库,它们在不同的方面都有其独特的优势。如果要选择一个库,可以根据具体的项目需求来选择。如果主要需要验证JSON数据的结构且考虑性能,那么ajv可能是更好的选择。如果需要验证JavaScript对象、字符串和数字等更多的数据类型,那么joi可能是更好的选择。