• home > webfront > ECMAS > nodejs >

    AJV(Another JSON Schema Validator)入门小结

    Author:zhoulujun Date:

    JSON Schema 的诞生背景源于对 JSON 数据格式的广泛采用及随之而来的需要验证 JSON 数据结构和内容的需求。AJV多级 嵌套JSON模式验证是一种用于验证JSON数据的工具。AJV多级 嵌套JSON模式验证的优势在于高性能与完备性

    JSON验证器

    JSON模式是一种用于描述JSON数据结构的规范。它定义了JSON对象的属性、类型、格式等约束条件。通过使用JSON模式,我们可以确保输入的数据符合预期的格式和结构,提高数据的准确性和一致性。

    在复杂系统和跨团队合作中,确保数据的一致性和正确性变得尤为重要。

    JSON Schema 的诞生背景源于对 JSON 数据格式的广泛采用及随之而来的需要验证 JSON 数据结构和内容的需求

    JSON Schema 官方网站:http://json-schema.org/

    JSON Schema Validator用于验证JSON数据是否符合预定义的结构和规则。以下是使用JSON Schema Validator的一些主要原因:

    1. 数据验证

      • 确保数据完整性:JSON Schema Validator能够验证JSON数据是否符合预期的格式和结构,从而确保数据的完整性。这对于避免数据错误和不一致至关重要。

      • 减少错误和异常:通过提前验证数据,可以在数据进入系统之前捕获并纠正错误,从而减少运行时错误和异常的发生。

    2. 数据一致性

      • 统一数据格式:在不同的系统、服务或应用之间传输数据时,JSON Schema Validator可以确保数据遵循统一的格式和标准,从而促进数据的一致性和互操作性。

      • 增强数据可读性:明确的JSON Schema定义使得数据更易于理解和使用,特别是在复杂的系统中。

    3. 自动化处理

      • 简化数据解析:使用JSON Schema Validator可以自动化地解析和验证数据,减少手动检查和修正的工作量。

      • 支持数据转换:JSON Schema不仅用于验证,还可以作为数据转换的依据,帮助将数据从一种格式转换为另一种格式。

    4. 安全性和合规性

      • 防止恶意输入:通过验证数据,可以防止恶意用户或系统注入不符合预期的数据,从而增强系统的安全性。

      • 符合数据保护法规:在涉及个人数据或敏感信息的场景中,JSON Schema Validator可以帮助确保数据符合相关的数据保护法规和隐私政策。

    5. 开发和维护效率

      • 快速开发和迭代:明确的JSON Schema定义使得开发人员能够更快地理解和处理数据,从而加速开发和迭代过程。

      • 降低维护成本:使用JSON Schema Validator可以减少因数据错误和不一致而导致的维护工作量,降低维护成本。

    6. 文档化和沟通

      • 清晰的文档:JSON Schema本身可以作为数据的文档,帮助开发人员、测试人员和其他利益相关者理解数据的结构和要求。

      • 促进团队协作:通过共享的JSON Schema,团队成员可以更容易地沟通和协作,确保数据在整个项目生命周期中的一致性和准确性。

    后端语言很多也没有提供官方的json-schema库,但是一些基本耳熟能详!

    • Java:json-schema-validator、everit-org/json-schema、JsonSchema4J、Eclipse Verifier

    • Python:jsonschema、Pydantic、Cerberus

    • .NET:jsonschema.net、Json.NET (Newtonsoft.Json)、ServiceStack.Text

    • PHP:json-schema

    为什么选择AJV?

    而nodejs作为后期之秀,没意go、java、swift那样的金主爸爸,JSON Schema  Validator一堆,按照流行度排名如下

    image.png


    而ajv比jsonschema的github star 多10倍。具体可以查看


    AJV概述

    AJV是"Another  JSON Schema  Validator"的缩写,它是一个高性能的JSON模式验证器。它支持多级和嵌套的JSON模式验证,可以用于验证复杂的数据结构。

    AJV多级/嵌套JSON模式验证的优势包括:

    1. 灵活性:AJV支持多级和嵌套的JSON模式验证,可以适应各种复杂的数据结构和验证需求。

    2. 高性能:AJV是一个高性能的JSON模式验证器,具有快速的验证速度和低的内存消耗。

    3. 完备性:AJV支持JSON Schema Draft      7标准,提供了丰富的验证功能,包括数据类型、格式、枚举值、条件验证等。

    4. 易用性:AJV提供了简单易用的API和命令行工具,方便开发人员进行JSON模式验证的集成和调试。

    1. 扩展性:AJV 支持插件系统,允许用户通过插件来扩展其功能,如添加自定义格式验证等。

    2. 兼容性:AJV 支持最新的 JSON Schema 规范,包括 draft-04、draft-06 和 draft-07,以及 JSON Schema 最新版本(即2019-09)。

    3. 集成性:AJV 可以方便地与 Express.js 等流行的 Node.js 框架集成。

    4. 静态类型支持:AJV 支持 TypeScript,这对于使用 TypeScript 开发的应用程序来说是一个很大的优点。

    AJV多级/嵌套JSON模式验证可以应用于各种场景,包括但不限于:

    1. 表单验证:可以用于验证用户提交的表单数据,确保数据的完整性和正确性。

    2. API参数验证:可以用于验证API接口的输入参数,防止非法或不合规的数据进入系统。

    3. 数据校验:可以用于验证从外部系统获取的数据,确保数据的有效性和安全性。

    4. 配置文件验证:可以用于验证配置文件的格式和内容,避免配置错误导致系统异常。

    AJV为什么高效?

    AJV(Another JSON Schema Validator)之所以能在性能上有优秀的表现,主要是由于以下几个方面的设计和实现:

    • 编译模式:AJV 采用了编译模式(核心优势之一是其编译优化的能力),即将 JSON Schema 编译成 JavaScript 函数。这意味着在第一次加载模式后,AJV 会生成一段 JavaScript 代码,这段代码专门用于验证与之对应的 JSON 数据。这种方式减少了每次验证时的解析开销,提高了验证速度。

    • 代码生成:通过代码生成技术,AJV 能够生成高度优化的验证函数。这些函数是针对特定模式定制的,可以更有效地执行验证逻辑,避免了运行时解释模式所带来的性能损失。

    • 内存优化:AJV 在内存管理方面做了优化,尽量减少了不必要的对象创建和垃圾回收压力。这对于处理大数据量的情况尤为重要。

    • 异步支持:AJV 支持异步验证,这对于需要访问外部资源(如数据库或远程服务)的模式特别有用。异步操作不会阻塞事件循环,从而提高了整体性能。

    • v8 引擎优化:AJV 的代码生成机制特别考虑了 v8 引擎(Chrome 和 Node.js 默认使用的 JavaScript 引擎)的优化,这使得生成的代码能够更好地利用 v8 的性能特性。

    •  高效的算法和数据结构:AJV内部使用了高效的算法和数据结构来处理JSON Schema的验证。例如,AJV使用了一种称为“字典树”(Trie)的数据结构来存储和查找Schema的关键字,这使得查找和匹配操作非常快速。

    • 缓存机制:AJV内置了强大的缓存机制,可以缓存编译后的验证函数,避免重复编译相同的Schema。这对于频繁使用的Schema尤其有效。

    Ajv 的赞助商有moz://a、Microsoft等,使用Ajv的开源项目也非常多,如:ESLint、webpack等,并且在NodeJs、浏览器、桌面应用程序、微信小程序等平台均有应用。

    9e7d2b0432bf4c9c8477b0e5c5d12aec~tplv-k3u1fbpfcp-zoom-in-crop-mark_1512_0_0_0 (1).webp

    更多,还是阅读官方:https://ajv.js.org/guide/why-ajv.html


    AJV使用

    schema定义说明:

    • type设置为object表示目标JSON文档是一个对象;

    • properties设置这个对象的属性包括foo、bar并分别指明其类型;

    • required通过列表的形式限制foo为必填项;

    • additionalProperties设置为false表示仅能包已声明的属性**。**

    比如:

    const schema = {
      type: 'object',
      properties: {
        attribute1,
        attribute2,
        ...
      },
      required: ['attribute1'], // 必填属性
      additionalProperties: false, // 禁止多余属性
    }

    具体可以查看官方API:https://ajv.js.org/api.html

    格式校验

    从版本 7 开始,Ajv 不包含 JSON Schema 规范定义的格式 - 这些和其他几种格式由 ajv-formats (opens new window)插件提供。

    ajv-formats (opens new window)中定义了以下格式,用于使用 "format" 关键字进行字符串校验:

    有关更多详细信息,请参阅 ajv-formats (opens new window)文档。

    管理结构

    组合结构

    你可以跨多个结构文件构建校验逻辑,并使用 $ref 关键字让结构相互引用。

    https://ajv.nodejs.cn/guide/combining-schemas.html






    转载本站文章《AJV(Another JSON Schema Validator)入门小结》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/JS-Server/9293.html

    下一篇:node_modules黑洞