javascript
json schema多种形式_什么是JSON Schema?及其应用方式......
如果你曾經(jīng)使用過XML Schema,RelaxNG或ASN.1,那么你很可能已經(jīng)知道什么是JSON Schema,并且可以跳過本文的閱讀。如果你是頭一次聽說,或者聽過過這個(gè)詞匯但不了解,那么你來對地方了。
要了解JSON Schema是什么,我們應(yīng)該首先了解JSON是什么。
JSON代表“JavaScript Object Notation”,一種簡單的互聯(lián)網(wǎng)數(shù)據(jù)交換格式。由于JavaScript存在于絕大多數(shù)Web瀏覽器中,而JSON基于JavaScript而來,因此很容易在JavaScript中的得到支持。同時(shí),它已被證明足夠有用且足夠簡單,現(xiàn)在也被用于許多其他不涉及互聯(lián)網(wǎng)數(shù)據(jù)交換的環(huán)境中。
從本質(zhì)上講,JSON建立在以下數(shù)據(jù)結(jié)構(gòu)上:
對象:
{ "key1": "value1", "key2": "value2" }
數(shù)組:
[ "first", "second", "third" ]
數(shù)值:
42 3.1415926
字符串:
"This is a string"
布爾:
true false
空值:
null
以上這些類型在大多數(shù)編程語言中都有接近的對照類型,但它們可能有不同的名稱。
利用這些簡單的數(shù)據(jù)類型,可以表示出各種結(jié)構(gòu)化數(shù)據(jù)。然而,這種巨大的靈活性帶來了巨大的責(zé)任,因?yàn)橥瑯拥母拍羁梢杂脽o數(shù)種方式表現(xiàn)出來。例如,你可以想象以不同方式表示有關(guān)JSON中某人的信息:
{
"name": "George Washington",
"birthday": "February 22, 1732",
"address": "Mount Vernon, Virginia, United States"
}
以及:
{
"first_name": "George",
"last_name": "Washington",
"birthday": "1732-02-22",
"address": {
"street_address": "3200 Mount Vernon Memorial Highway",
"city": "Mount Vernon",
"state": "Virginia",
"country": "United States"
}
}
以上這兩種表述同樣有效,但第二種顯然比第一種更正式。數(shù)據(jù)記錄的設(shè)計(jì)在很大程度上取決于其在應(yīng)用程序中的預(yù)期用途,因此這里沒有正確或錯誤的答案。但是,當(dāng)應(yīng)用程序通過API請求并期望得到一個(gè)人的JSON記錄時(shí),重要的是要確切知道該記錄應(yīng)該如何組織。也就是說,當(dāng)我們需要知道JSON數(shù)據(jù)中預(yù)期的字段以及值的表示方式時(shí),這就是JSON Schema的用武之地。
以下JSON Schema片段描述了上面第二個(gè)例子是如何構(gòu)建的。這里我們不對其中的細(xì)節(jié)解釋,但如果仔細(xì)觀察,你可以看到,以上第二個(gè)例子中的JSON數(shù)據(jù)結(jié)構(gòu),以及其中各個(gè)字段的類型信息在這里得到了很清晰的說明。
{
"type": "object",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"birthday": {
"type": "string",
"format": "date"
},
"address": {
"type": "object",
"properties": {
"street_address": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
}
}
}
}
}
通過“驗(yàn)證”針對此JSON Schema的第一個(gè)示例JSON數(shù)據(jù),您可以看到它失敗:
{
"name": "George Washington",
"birthday": "February 22, 1732",
"address": "Mount Vernon, Virginia, United States"
}
但是,第二個(gè)例子通過:
{
"first_name": "George",
"last_name": "Washington",
"birthday": "22-02-1732",
"address": {
"street_address": "3200 Mount Vernon Memorial Highway",
"city": "Mount Vernon",
"state": "Virginia",
"country": "United States"
}
}
您可能已經(jīng)注意到,JSON Schema本身是用JSON編寫的。它是JSON數(shù)據(jù)的規(guī)范,而不是計(jì)算機(jī)程序。它只是“描述JSON數(shù)據(jù)結(jié)構(gòu)”的聲明格式。這既是它的優(yōu)勢,也是它的弱點(diǎn)(和其他Schema語言類似)。它很容易簡潔地描述數(shù)據(jù)的表面結(jié)構(gòu),并可被用于在程序運(yùn)行時(shí)自動驗(yàn)證數(shù)據(jù)。但是,由于JSON Schema不能包含任意代碼,因此對無法表達(dá)的數(shù)據(jù)元素之間的關(guān)系存在某些限制。因此,對于足夠復(fù)雜的數(shù)據(jù)格式的任何“驗(yàn)證工具”可能具有兩個(gè)驗(yàn)證階段:一個(gè)在結(jié)構(gòu)級別,另一個(gè)在語義級別。對于結(jié)構(gòu)級別的檢查,可以使用Schema語言。對于語義級別的檢查,可能需要使用更通用的編程語言來實(shí)現(xiàn)。
JSON Schema在API的設(shè)計(jì)與實(shí)現(xiàn)中具有相當(dāng)重要的作用。具備JSON Schema校驗(yàn)?zāi)芰Φ腁PI實(shí)現(xiàn)可以幫助對來自用戶輸入數(shù)據(jù)的自動校驗(yàn),以及應(yīng)用在各類需要在程序運(yùn)行時(shí)完成校驗(yàn)的場景中。這可以幫助開發(fā)者以更加規(guī)范、嚴(yán)謹(jǐn)?shù)姆绞絹砻枋鲎约旱腁PI上承載的JSON數(shù)據(jù),同時(shí)少寫許多手工校驗(yàn)的程序代碼。
遺憾的是,目前流行的REST API設(shè)計(jì)并不能直接使用JSON Schema帶來的這種能力,這很大程度上在于,在REST API的設(shè)計(jì)理念中,API請求的參數(shù)并不是一個(gè)JSON對象,而是以資源模型的方式來描述,這使得無法使用JSON Schema來描述和自動校驗(yàn)這類API上傳遞的數(shù)據(jù)。
在CEAMS通用接口管理系統(tǒng)上,系統(tǒng)并沒有使用REST API的設(shè)計(jì)風(fēng)格,而是參考了經(jīng)典的SOAP協(xié)議設(shè)計(jì),規(guī)定API的請求參數(shù)和返回結(jié)果必須是一個(gè)JSON對象或者數(shù)組,并且為開發(fā)者提供了包含JSON Schema支持的API規(guī)范設(shè)計(jì)向?qū)?#xff0c;用戶可以很方便地在這里設(shè)計(jì)和制定自己API上的JSON數(shù)據(jù)規(guī)范。同時(shí),設(shè)計(jì)好的JSON Schema將在程序執(zhí)行時(shí),完成對請求和返回結(jié)果JSON數(shù)據(jù)的校驗(yàn),幫助提高了API數(shù)據(jù)的安全性,并且避免了手寫校驗(yàn)代碼的繁瑣。
除了用于完成JSON數(shù)據(jù)校驗(yàn)外,由于可以為JSON數(shù)據(jù)提供清晰、嚴(yán)謹(jǐn)?shù)穆暶?#xff0c;JSON Schema在自動化API文檔、自動化輸入表單生成、JSON數(shù)據(jù)可視化等方面也有很好的應(yīng)用場景。有不少開源項(xiàng)目提供了基于JSON Schema的自動化輸入表單生成能力。CEAMS系統(tǒng)集成了其中知名的Angular Schema Form,用于為開發(fā)者提供的清晰、直觀的API測試工具。這樣的工具幫助開發(fā)者進(jìn)一步簡化了API測試的過程,提高了測試的效率。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的json schema多种形式_什么是JSON Schema?及其应用方式......的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 樊登高效休息法心得400字_真的,你应该
- 下一篇: matlab逆变换法产生随机数_matl