JSON數(shù)據結構殿衰,在互聯(lián)網時代被廣泛的運用在系統(tǒng)調用的交互中。由于其簡潔、易懂捺癞、可讀性好夷蚊,基本壟斷了用戶端和服務器之間的數(shù)據交換之中。JSON是用來表示數(shù)據的翘簇,那么表示JSON結構的數(shù)據結構是什么呢撬码?哈哈,有點繞口啊版保,這就是我想要講的JSON Schema呜笑。就像Meta Data(元數(shù)據)被稱為是描述數(shù)據的數(shù)據,那么JSON Schema就是描述JSON數(shù)據的JSON數(shù)據彻犁。
JSON Schema描述JSON數(shù)據格式的JSON叫胁!
首先上一張圖!
Douglas Crockford 發(fā)明JSON的時候說整個JSON的數(shù)據結構的語法可以完全寫在一張名片上汞幢,他還真這么做了驼鹅,這是他的名片的背面∩瘢可見JSON格式是多么的簡潔啊输钩。我經常會感嘆,牛人確實是牛人仲智,偉大的東西一般都很簡潔买乃,當然不代表很簡單。剛開始了解的時候钓辆,會覺得真是簡單剪验,當然這只是用起來,可是又一次我想說自己試著寫個JSON解析器的時候前联,就知道多么難了功戚,各種邊界情況,各種考慮似嗤,最后還是乖乖的看看別人的實現(xiàn)啸臀。好像扯遠了!
首先我們要知道烁落,JSON Schema本身也是一個JSON數(shù)據結構壳咕,用一種特定的JSON數(shù)據結構來描述另一個JSON數(shù)據結構的結構!顽馋!也是夠繞的谓厘。有點像雞生蛋、蛋生雞的味道寸谜。
一般當我了解到一個東西的時候(尤其是技術竟稳、標準),我會去看一下它到底是個什么東西,用來干嘛他爸,怎么實現(xiàn)等等的角度聂宾,和身邊的小伙伴聊天,看一個技術很多時候最初也是從這個角度來出發(fā)了诊笤。這里并不想從這些角度來思索這個東西系谐,首先JSON Schema是一個開源標準,任何人都可以使用讨跟,主要分兩個部分:
Schema 標準的定義
JSON Schema
JSON Hyper-Schema
Validation 數(shù)據結構的驗證
具體的內容可以去這里尋找纪他,整個標準的文檔也不算長:http://json-schema.org/
這里還要一些JSON Schema Validation的實現(xiàn):
https://github.com/epoberezkin/ajv
http://json-schema.org/implementations.html#validators
比起怎么實現(xiàn),我更加想知道它的價值是什么晾匠,為什么需要這個標準茶袒?能用來干嘛?
還是得想為什么需要JSON Schema凉馆?
描述數(shù)據結構的數(shù)據結構薪寓,讓我想起了MetaData - 描述數(shù)據的數(shù)據。在我們的各種設備中澜共,都會用到各種metadata向叉,比如描述文件,描述圖片的嗦董,描述文件夾的等等母谎。
首先想到的是一些場景可以用到:
當我們創(chuàng)建一種JSON結構來前后端通信的時候,如果校驗比較嚴格展懈,那么可以為每一種結構創(chuàng)建JSON Schema然后用來數(shù)據結構的校驗。
又比如比如我們希望用一種結構讓前端的渲染和數(shù)據結構來對應起來供璧,然后希望可以編輯存崖,那么就需要一種Schema來生成編輯器。通過Schema生成的編輯器就可以最終變成我們指定的結構睡毒。
其實第二種場景比較常見来惧,如果我們想創(chuàng)作一個像Sketch的編輯器,那么里面有很多的組件演顾,編輯器的生成可能就是通過一些列的Schema來生成供搀,其實最后生成的最終結構也是一個JSON。這里其實是對自己的一些項目是有啟發(fā)式的钠至,很多時候我們絞盡腦汁的想一個結構來描述屬性葛虐、樣式等等,其實直接使用JSON Schema的標準來實現(xiàn)棉钧,是事半功倍的屿脐。
很多時候我們希望能夠創(chuàng)造出一種產品,可以通過配置配置,通過拖拖拽拽的诵⊥蛘ぃ或者我們不想每次都重復開發(fā),不希望做自定義化產品西疤,比如crm系統(tǒng)烦粒、建站工具等等,那么我們可能就需要一種標準來描述整個系統(tǒng)代赁、模塊扰她、組件等等本身,通過一種統(tǒng)一的標準來把多個東西拼接在一起管跺∫謇瑁或許在這種時候,我們也可以用到豁跑。
JSON解析還有JS廉涕?
我覺得JS成功其中一個原因就是內置了JSON格式處理,這個大大方便了各種處理艇拍。JSON的處理有時候還是很頭疼的狐蜕,雖然JS看上去挺簡潔易上手的,和JSON一樣卸夕,各種邊界层释、各種小技巧層出不窮。過于簡潔就好像用0101來編程一樣快集,當然這個比喻好像不太恰當贡羔。有時候限制是必要的。
所以我覺得JSON Schema的其中一個用處就是限制个初,當各方拿到的是相同的Schema那么就本質上限制了JSON結構了乖寒,也就是我們知道得到的是什么,就好像Java里面我們需要定義類型院溺,我們知道這個變量只能是這么個類型楣嘁,在JS中就不行了,過度自由珍逸,最后發(fā)現(xiàn)又得加上一些枷鎖逐虚,這樣可能更利于開發(fā)大型項目和管理代碼∽簧牛可是太死板了叭爱,有會導致大家努力把它變得更靈活。很多時候也是一種平衡吧漱病。
要不要用Schema得看情況涤伐,如果任何時候都用馒胆,那么開發(fā)起來應該效率不高。深入去了解這個標準凝果,你會發(fā)現(xiàn)基本可以描述一切祝迂!說不定某個時刻會有用的!了解下~