JSON-Schema学习心得

一、介绍

JSON数据在WEB中的使用非常频繁,但是因为以字符串的形式作为基础,在实际使用中数据的格式难以标准化,没有约束性的条件。这导致编写JSON字符串的过程中容易出现错误。

JSON-schema就是在这一过程中定义的一种标准,它类似于数据库中数据表属性的建立以及设置约束,当我们使用以他为标准的库生成JSON数据时会检测属性是否符合定义要求,这样,数据的标准型有了提升,错误能够及时纠正,维护起来更加方便。

具体的文档为http://json-schema.org/example2.html

结合数据库的使用知识,JSON-schema很容易理解。阅读文档之后,我理解的schema中的核心分为两个部分,属性的定义和约束的定义。前者用来确定我们一个即将创立的json字符串(从某种角度上来说,这类似于一份数据表,这有助于我的理解)中需要的属性有哪些,后者决定每个属性是什么类型的,并且设置一定的约束条件,比如说类似数据库中的unique约束,primary key约束,定义域,特定的字符串格式(正则表达式)等等。

在实际使用中,我们会通过schema的形式设定好数据格式,然后使用支持这一标准的依赖包实现。通过依赖包中的API来添加数据,就会依据我们定义的schma去检测数据合法性

二、使用

1、basic

SCHEMA中有一些basic的属性,$schema设置schema所使用的参照标准,title和description顾名思义,是标题和描述,没有具体的作用。type设置类型,如果是JSON数据,必须设置为object。

需要注意的是虽然我们一般使用schema是为了生成json类型,但是并不是只有这一种类型可以生成。

为了更详细的说明,这里给出一个定义保存正整数的数组的schema的例子

这些属性中并不是必须得,但是防止出错以及提高可读性,建议这四个keyword都在schema中保留会比较好

最后是id属性,用于改变scope,不同的id可以类比为使用的是不同的库中的schema定义,这样对于已有的一些schema可以直接使用,不需要再次定义。

2、properties

属性集合我们使用properties来表示,对于单独的一个属性,最基本的两个定义是type和description,type负责定义数据类型,可以参考RFC4627中的类型定义。(https://tools.ietf.org/html/rfc4627

properties中写上独立的每一个

除此之外,还有许多的API可以供我们使用,比如说定义属性范围。具体的API参考文档。推荐看的是example部分,列出了常用的一些格式的定义方法,基本能够涵盖大多数的应用需求。这里列出一些十分有用但是我自身没有养成使用习惯的功能。

regex

schema中最有用的优点之一是支持正则表达式的检测,使用‘pattern’进行正则表达式定义使用。

definition

有些属性在json中是会经常出现的,如果每次都需要去定义的话就十分没有必要(DRY),所以,schema中提供了definition的概念,我们可以预定义一些属性,在需要生成具体的数据时我们直接引用(使用$ref)即可。

最后,是声明必填项的required,类比于数据项中的not NULL属性,但是稍微有一些区别,required中的属性是json数据中必须要填写,但是他在type为string时可以为空值,这是因为在RFC4627中,JSON的值域中是包含有空值的。


3、总结

schema是一种general化json格式和normalize的标准,一方面,标准化定义可以使得我们不需要在实际应用编写中增加额外的检测代码,另一方面,我们也能更加直观地了解数据的内容。

在我们编写的GFC框架中,有可能会需要进行增加功能或者增加自己模块的一些schema标准,所以,为了编写出可用性够高的代码,我们需要仔细了解schema标准。











  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值