JSON是一种表示数据的格式,类似的还有XML。与XML对比,JSON比较易读,而且数据量比较小,就是行话里说的比较轻量。JSON在Web应用里用得比较多,如今,好多本地应用里也可以一见它的身影。
以往我们总讲面向对象编程,现在又逐渐泛出另一种思想,称为面向数据编程,据我的理解,讲的是数据即是对象,对象即是数据,举个例子,两段程序,分别对应两个对象,它们接收数据而且产生数据,如果接收数据的格式一致并且产生数据的格式也一致,那么这两个对象可以看做是“一类”对象,它们之间是可以互相替换的。现在问题是如何判断两个对象接收的数据是否一致,这就是本文所要介绍的JSON Schema。
JSON Schema本身也是一种JSON,它的作用是校验别的JSON是否符合一定的规范,所以我们可以把JSON Schema称为JSON范式或模式。JSON范式包含一系列的关键字,每个关键字对应一个值。其中比较关键的关键字有Title、Description、Type和Properties。Title表示这个范式的标题,必不可少,是一个字符串类型的值。Description也是字符串类型的值,可以用来表示整个范式的说明,也可以表示某个属性的说明。Type,是JSON里比较基础的关键字,类型,用来描述范式及属性的基本格式。类型有六种:null,boolean,number,string,array和object。范式的类型只能是object类型。Properties就是属性,我们用JSON也就是用它的属性。属性一般是一组,每一个属性都有Description和Type等关键字。如果Type关键字是array,说明属性由一组相同类型的元素组成,这个元素可以是基本类型,也可以是Object类型。如果Type关键字是Object,说明属性是一个对象,那么这个对象必然有其自己的范式定义,这就是嵌套定义一个范式。可以想见,由这样的一个范式定义可以表示出极大丰富的数据内容。除了这几个比较重要的关键字,还有一些起到修饰、限制作用的关键字,用来补充定义属性的,比如required、minimum、maximum、minlength、maxlength等,分别表示必需的属性、属性最小值、属性最大值、属性最小长度、属性最大长度等。
这么一个范式定义在应用中能起到什么作用呢?其实就是一个数据校验的作用。举一个浅显的例子,编一个动物园数据应用程序,要把这么多动物的数据保存并且随时读取显示,没有一定的数据规范是不太好弄的。那么,在数据录入端便可以使用一套定义动物的JSON范式,只要符合这套范式的JSON动物数据,就可以通过一个统一的数据录入程序读取并保存。比如规定,动物数据必需有名称、科属、产地、外貌特征、生活习性、体重、寿命等这些属性,这些属性多数是字符串类型的,少数是数字类型的。这样定义好之后,所有提供数据的程序都要求产生符合这个范式的数据,否则将予以驳回。
有人说,这些工作面向对象的程序也可以实现,而且用数据库字段的方式完全可以胜任,而且做起来比较自然。面向数据的方式在某些方面比面向对象有较大的优势,比如,数据格式的可维护性,不需要重新写代码,也不需要定义数据库字段,数据库只存了个范式,把这个范式改了就可以了。面向数据的方式也有它的不足,最大的问题就是稍嫌复杂,不够直观。这使我一下子想起来正则表达式,那就是一个数据验证方式的极端例子,可读性与可维护性,很是矛盾。