校验数据结构
如何校验数据结构,一般情况下,我们应该考虑现成的轮子。
以下是几个常见的 JavaScript JSON Schema Library:
- ajv
- 星数:12.4k
- npm 周下载数量:83.31m
- jsonschema
- 星数:1.7k
- npm 周下载数量:2.1m
- joi
- 星数:19.8k
- npm 周下载数量:7.6m
- z-schema
- 星数:322
- npm 周下载数量:1.7m
这些库都可以用于校验和验证 JSON 数据结构。
这些库的主要区别在于其性能、功能和 API 设计方面。以下是一些关键区别:
- ajv:是性能最快的库之一,支持 JSON Schema Draft 7、Draft 6 和 Draft 4。它具有基于关键字、关联和异步验证等高级功能。
- jsonschema:是一个功能齐全的库,支持 JSON Schema Draft 7、Draft 6 和 Draft 4。它支持从字符串或文件中加载模式,并且包含许多有用的验证器和错误消息。
- joi:是一个强大的库,支持校验 JavaScript 对象、字符串和数字等。它的 API 设计非常直观,可以轻松地定义和校验复杂的数据结构。
- z-schema:是一个快速的库,支持 JSON Schema Draft 4。它支持在模式中使用 $ref 引用,并且具有不同的验证模式(严格、宽松和非严格)。
每个库都有其独特的优点和适用场景,具体取决于您的需求和项目的要求。
以下是每个库的示例:
ajv:
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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设计方面都有一些区别。以下是它们之间的比较:
社区生态
- ajv是最受欢迎的JSON Schema验证器之一,有超过12k的星和83.31m的npm周下载量。
- joi也有很高的知名度,拥有超过19.8k的星和7.6m的npm周下载量。
用法
- ajv主要用于验证JSON数据的结构,但也支持异步验证、关联和关键字验证等高级功能。
- 相比之下,joi更适合于验证JavaScript对象、字符串和数字等数据类型,但它的API设计非常直观,可以轻松地定义和验证复杂的数据结构。
API设计
- ajv的API设计比joi复杂一些,但它支持一些joi没有的高级功能,例如异步验证和关联验证。
- joi的API设计非常直观,易于使用,并且可以轻松地定义和验证复杂的数据结构。
总的来说,ajv和joi都是非常流行的JSON Schema库,它们在不同的方面都有其独特的优势。如果要选择一个库,可以根据具体的项目需求来选择。如果主要需要验证JSON数据的结构且考虑性能,那么ajv可能是更好的选择。如果需要验证JavaScript对象、字符串和数字等更多的数据类型,那么joi可能是更好的选择。