JSON 和 JSON Schema
JSON数据结构,在互联网时代被广泛的运用在系统调用的交互中。由于其简洁、易懂、可读性好,基本垄断了用户端和服务器之间的数据交换之中。JSON是用来表示数据的,那么表示JSON结构的数据结构是什么呢?哈哈,有点绕口啊,这就是我想要讲的JSON Schema。就像Meta Data(元数据)被称为是描述数据的数据,那么JSON Schema就是描述JSON数据的JSON数据。
JSON Schema描述JSON数据格式的JSON!
首先上一张图!
Douglas Crockford 发明JSON的时候说整个JSON的数据结构的语法可以完全写在一张名片上,他还真这么做了,这是他的名片的背面。可见JSON格式是多么的简洁啊。我经常会感叹,牛人确实是牛人,伟大的东西一般都很简洁,当然不代表很简单。刚开始了解的时候,会觉得真是简单,当然这只是用起来,可是又一次我想说自己试着写个JSON解析器的时候,就知道多么难了,各种边界情况,各种考虑,最后还是乖乖的看看别人的实现。好像扯远了!
首先我们要知道,JSON Schema本身也是一个JSON数据结构,用一种特定的JSON数据结构来描述另一个JSON数据结构的结构!!也是够绕的。有点像鸡生蛋、蛋生鸡的味道。
一般当我了解到一个东西的时候(尤其是技术、标准),我会去看一下它到底是个什么东西,用来干嘛,怎么实现等等的角度,和身边的小伙伴聊天,看一个技术很多时候最初也是从这个角度来出发了。这里并不想从这些角度来思索这个东西,首先JSON Schema是一个开源标准,任何人都可以使用,主要分两个部分:
Schema 标准的定义
JSON Schema
JSON Hyper-Schema
Validation 数据结构的验证
具体的内容可以去这里寻找,整个标准的文档也不算长:http://json-schema.org/
这里还要一些JSON Schema Validation的实现:
https://github.com/epoberezkin/ajv
http://json-schema.org/implementations.html#validators
比起怎么实现,我更加想知道它的价值是什么,为什么需要这个标准?能用来干嘛?
还是得想为什么需要JSON Schema?
描述数据结构的数据结构,让我想起了MetaData - 描述数据的数据。在我们的各种设备中,都会用到各种metadata,比如描述文件,描述图片的,描述文件夹的等等。
首先想到的是一些场景可以用到:
当我们创建一种JSON结构来前后端通信的时候,如果校验比较严格,那么可以为每一种结构创建JSON Schema然后用来数据结构的校验。
又比如比如我们希望用一种结构让前端的渲染和数据结构来对应起来,然后希望可以编辑,那么就需要一种Schema来生成编辑器。通过Schema生成的编辑器就可以最终变成我们指定的结构。
其实第二种场景比较常见,如果我们想创作一个像Sketch的编辑器,那么里面有很多的组件,编辑器的生成可能就是通过一些列的Schema来生成,其实最后生成的最终结构也是一个JSON。这里其实是对自己的一些项目是有启发式的,很多时候我们绞尽脑汁的想一个结构来描述属性、样式等等,其实直接使用JSON Schema的标准来实现,是事半功倍的。
很多时候我们希望能够创造出一种产品,可以通过配置配置,通过拖拖拽拽。或者我们不想每次都重复开发,不希望做自定义化产品,比如crm系统、建站工具等等,那么我们可能就需要一种标准来描述整个系统、模块、组件等等本身,通过一种统一的标准来把多个东西拼接在一起。或许在这种时候,我们也可以用到。
JSON解析还有JS?
我觉得JS成功其中一个原因就是内置了JSON格式处理,这个大大方便了各种处理。JSON的处理有时候还是很头疼的,虽然JS看上去挺简洁易上手的,和JSON一样,各种边界、各种小技巧层出不穷。过于简洁就好像用0101来编程一样,当然这个比喻好像不太恰当。有时候限制是必要的。
所以我觉得JSON Schema的其中一个用处就是限制,当各方拿到的是相同的Schema那么就本质上限制了JSON结构了,也就是我们知道得到的是什么,就好像Java里面我们需要定义类型,我们知道这个变量只能是这么个类型,在JS中就不行了,过度自由,最后发现又得加上一些枷锁,这样可能更利于开发大型项目和管理代码。可是太死板了,有会导致大家努力把它变得更灵活。很多时候也是一种平衡吧。
要不要用Schema得看情况,如果任何时候都用,那么开发起来应该效率不高。深入去了解这个标准,你会发现基本可以描述一切!说不定某个时刻会有用的!了解下~