校验数据结构调研

2023-04-22 19:05:40 浏览数 (1)

校验数据结构

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

以下是几个常见的 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可能是更好的选择。

0 人点赞