校验数据结构调研

校验数据结构

如何校验数据结构,一般情况下,我们应该考虑现成的轮子。

以下是几个常见的 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:

    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可能是更好的选择。