校验数据结构
如何校验数据结构,一般情况下,我们应该考虑现成的轮子。
以下是几个常见的 JavaScript JSON Schema Library:
-
- 星数:12.4k
- npm 周下载数量:83.31m
-
- 星数:1.7k
- npm 周下载数量:2.1m
-
- 星数:19.8k
- npm 周下载数量:7.6m
-
- 星数: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:
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设计方面都有一些区别。以下是它们之间的比较:
社区生态
- 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可能是更好的选择。