上一篇文章我们详细介绍了如何配置json schema,这篇文章介绍一个校验工具——ajv,你可以把schema和需要校验的数据传给它,由它来完成校验工作。话不多说,我开始敲代码。

6a2ae43c8e2ccf6695f869718e8031b6.png

图1

  • 先安装ajv模块;
  • 创建一个ajv实例;
  • 配置好schema,传入ajv实例的compile方法中;
  • 再用compile方法返回的函数校验数据;
  • 如果校验失败,ajv会输出错误信息。
2738a1a39aef9533729b8b487f61fb36.png

图2

如图2所示,咱们故意把product数据改错,控制台打印出了详细的错误信息。图中dataPath是数据的路径,schemaPath是报错的schema关键字的路径。

67c8fcbca8d2171338aca968ab07e0d1.png

图3

如图3,我们也可以在ajv实例化的时候传入多个schema,然后使用getSchema方法获取对应的schema来校验数据,这个方法的参数就是关键字$id的值。$id的含义在上一篇文章中我们已经讲了,在此图中虽然$id是一个uri,但是编辑器并不会去下载。细看图中第一个schema,$ref的值是defs.json,转化成绝对路径是http://localhos:8000/defs.json,就是下面那个defSchema,也就是说$ref指向的schema在本文件中必须存在。如果在ajv实例化时只传入schema不传入defsSchema就会报错。

740c8e0eb89a8050de248ffb9c4b541e.png

图4

如图4所示,如果在ajv实例化时没传入defsSchema,也可以使用addSchema方法添加,效果是一样的。

从上可以看出这些方法都是以$id作为schema的标识,使用addSchema方法的第二个参数可以自定义标识,如下:

286ea70bd960913a3f7d20e513704fdb.png

图5

图5中我们把schema的标识改成了aa字符串,后面的getSchema方法可以通过aa字符串获取到对应的schema。

af794fb8cacfc055c220b171853fd21f.png

图6

如果你了解json pointer的话,还可以利用它做一些事情。如图6中smaller的最大值要小于larger,这时可以使用json pointer语法将maximum的属性值指向larger。

接下来说说利用ajv.addKeyword方法怎么自定义关键字?

1、使用validate方法

f639a50fcd77db8fa9d8fec0d66f7ce5.png

图7

如图7传入validate方法,参数schema是关键字的值,data是数据的值,validate方法返回的结果代表是否能通过验证。

2、使用compile方法

25a3674428e245d52e860a3fb731ce22.png

图8

如图8,compile方法第一个参数是自定义关键字的值,第二参数是包含关键字的整个schema,这个方法返回一个函数,这个函数参数的值是对应的数据,它的处理的结果代表能否通过验证。

3、使用macro方法

ed3ef27cec3760b5a766771e5af0e39f.png

图9

macro方法的参数是自定义关键字的值,经过处理返回一个新的schema,即用新的schema做校验。

4、使用inline方法

41004f99dd523529e16768c4fe2d72dd.png

图10

inline方法第一个参数是编译上下文环境,第二个参数是关键字名字,第三个参数是关键字对应的值,这个方法返回一个字符串。从控制台打印的信息我们可以看出,其实返回的是一个序列化的表达式,这个表达式的执行结果代表数据验证是否能通过。

读到这里,我相信聪明的你肯定能想到可以把上面的自定义关键字的逻辑封装成插件,如下:

34a3a372358896092863d20f5a7f8e1a.png

图11

社区已经提供了很多优秀的插件,比如webpack就在用ajv-keywords插件。

总结

这篇文章主要介绍了ajv如何使用,如果把json schema比作子弹,那么ajv就可以比作手枪,手枪和子弹都得有才行。如果你在使用react或者vue时经常写一些属性的类型校验,你会发现它和json schema很像,但是它们并不是一个东西,是框架自己开发的一套校验逻辑。当然,校验器肯定不止ajv一种,聪明的你们可以自己去发现开发更好的校验器。

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐