前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >校验数据结构调研

校验数据结构调研

作者头像
爱吃大橘
发布2023-04-22 19:05:40
7560
发布2023-04-22 19:05:40
举报
文章被收录于专栏:前端笔记薄

校验数据结构

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 校验数据结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档