AJV(Another JSON Schema Validator)入门小结
Author:zhoulujun Date:
JSON验证器
JSON模式是一种用于描述JSON数据结构的规范。它定义了JSON对象的属性、类型、格式等约束条件。通过使用JSON模式,我们可以确保输入的数据符合预期的格式和结构,提高数据的准确性和一致性。
在复杂系统和跨团队合作中,确保数据的一致性和正确性变得尤为重要。
JSON Schema 的诞生背景源于对 JSON 数据格式的广泛采用及随之而来的需要验证 JSON 数据结构和内容的需求。
JSON Schema 官方网站:http://json-schema.org/
JSON Schema Validator用于验证JSON数据是否符合预定义的结构和规则。以下是使用JSON Schema Validator的一些主要原因:
数据验证
确保数据完整性:JSON Schema Validator能够验证JSON数据是否符合预期的格式和结构,从而确保数据的完整性。这对于避免数据错误和不一致至关重要。
减少错误和异常:通过提前验证数据,可以在数据进入系统之前捕获并纠正错误,从而减少运行时错误和异常的发生。
数据一致性:
统一数据格式:在不同的系统、服务或应用之间传输数据时,JSON Schema Validator可以确保数据遵循统一的格式和标准,从而促进数据的一致性和互操作性。
增强数据可读性:明确的JSON Schema定义使得数据更易于理解和使用,特别是在复杂的系统中。
自动化处理:
简化数据解析:使用JSON Schema Validator可以自动化地解析和验证数据,减少手动检查和修正的工作量。
支持数据转换:JSON Schema不仅用于验证,还可以作为数据转换的依据,帮助将数据从一种格式转换为另一种格式。
安全性和合规性:
防止恶意输入:通过验证数据,可以防止恶意用户或系统注入不符合预期的数据,从而增强系统的安全性。
符合数据保护法规:在涉及个人数据或敏感信息的场景中,JSON Schema Validator可以帮助确保数据符合相关的数据保护法规和隐私政策。
开发和维护效率:
快速开发和迭代:明确的JSON Schema定义使得开发人员能够更快地理解和处理数据,从而加速开发和迭代过程。
降低维护成本:使用JSON Schema Validator可以减少因数据错误和不一致而导致的维护工作量,降低维护成本。
文档化和沟通:
清晰的文档: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一堆,按照流行度排名如下
而ajv比jsonschema的github star 多10倍。具体可以查看
AJV概述
AJV是"Another JSON Schema Validator"的缩写,它是一个高性能的JSON模式验证器。它支持多级和嵌套的JSON模式验证,可以用于验证复杂的数据结构。
AJV多级/嵌套JSON模式验证的优势包括:
灵活性:AJV支持多级和嵌套的JSON模式验证,可以适应各种复杂的数据结构和验证需求。
高性能:AJV是一个高性能的JSON模式验证器,具有快速的验证速度和低的内存消耗。
完备性:AJV支持JSON Schema Draft 7标准,提供了丰富的验证功能,包括数据类型、格式、枚举值、条件验证等。
易用性:AJV提供了简单易用的API和命令行工具,方便开发人员进行JSON模式验证的集成和调试。
扩展性:AJV 支持插件系统,允许用户通过插件来扩展其功能,如添加自定义格式验证等。
兼容性:AJV 支持最新的 JSON Schema 规范,包括 draft-04、draft-06 和 draft-07,以及 JSON Schema 最新版本(即2019-09)。
集成性:AJV 可以方便地与 Express.js 等流行的 Node.js 框架集成。
静态类型支持:AJV 支持 TypeScript,这对于使用 TypeScript 开发的应用程序来说是一个很大的优点。
AJV多级/嵌套JSON模式验证可以应用于各种场景,包括但不限于:
表单验证:可以用于验证用户提交的表单数据,确保数据的完整性和正确性。
API参数验证:可以用于验证API接口的输入参数,防止非法或不合规的数据进入系统。
数据校验:可以用于验证从外部系统获取的数据,确保数据的有效性和安全性。
配置文件验证:可以用于验证配置文件的格式和内容,避免配置错误导致系统异常。
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、浏览器、桌面应用程序、微信小程序等平台均有应用。
更多,还是阅读官方: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" 关键字进行字符串校验:
date:根据 RFC3339 (opens new window)的完整日期。
time:带有可选时区的时间。
date-time:来自同一来源的日期时间(时区是强制性的)。
duration:从 RFC3339 (opens new window)开始的持续时间
uri:完整的 URI。
uri-reference:URI 引用,包括完整和相对 URI。
uri-template:根据 RFC6570 (opens new window)的 URI 模板
网址(已弃用):网址记录 (opens new window)。
email:电子邮件地址。
hostname:根据 RFC1034 (opens new window)的主机名。
ipv4:IP 地址 v4。
ipv6:IP 地址 v6。
regex:通过将字符串传递给 RegExp 构造函数来测试字符串是否是有效的正则表达式。
uuid:根据 RFC4122 (opens new window)的通用唯一标识符。
json-pointer:根据 RFC6901 (opens new window)的 JSON 指针。
relative-json-pointer:根据 这个草案 (opens new window)的相对 JSON 指针。
有关更多详细信息,请参阅 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