1-先熟悉下JSON
節(jié)選自:http://www.json.cn/wiki.html
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式妹田。它使得人們很容易的進行閱讀和編寫华烟。同時也方便了機器進行解析和生成云头。 JSON采用獨立于編程語言的文本格式旷太,但是也使用了類C語言的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
json簡單說就是javascript中的對象和數(shù)組洽洁,因此JSON也基于兩種結構表示各種復雜結構:
對象:
對象在js中表示為“{}”括起來的內(nèi)容渴邦,數(shù)據(jù)結構為 {key:value,key:value,...}的鍵值對的結構,取值方法為 對象.key 獲取屬性值晦譬,這個屬性值的類型可以是 數(shù)字、字符串互广、數(shù)組蛔添、對象幾種。無序兜辞。數(shù)組:
數(shù)組在js中是中括號“[]”括起來的內(nèi)容,數(shù)據(jù)結構為 ["java","javascript","vb",...]夸溶,使用索引獲取逸吵,字段值的類型可以是 數(shù)字、字符串缝裁、數(shù)組扫皱、對象幾種。有序捷绑。
注意:
1-JSON中規(guī)定key必須使用雙引號
2-訪問數(shù)據(jù)可使用點號法
舉例:
{
"animals": {
"dog": [
{
"name": "Rufus",
"age":15
},
{
"name": "Marty",
"age": null
}
]
}
}
python字典與JSON的區(qū)別
原文鏈接:https://blog.csdn.net/u010569893/article/details/97538914
https://blog.csdn.net/qq_36117775/article/details/104226682
字典和JSON的格式很像韩脑,都是key:value形式,并且JSON和dict也可以使用dumps與loads相互轉換粹污,但它們還是有區(qū)別的段多。
dict是一種數(shù)據(jù)結構,而JSON那是一種數(shù)據(jù)格式壮吩,作為格式JSON會有很多形式限制进苍,比如必須使用雙引號作為邊界符號加缘,但字典可以使用單引號也可以使用雙引號。
dict作為完整的數(shù)據(jù)結構觉啊,是對Hash Table這一數(shù)據(jù)結構的一種實現(xiàn)拣宏,是一套從存儲到提取都封裝好了的方案。
- JSON的key只能是字符串杠人,dict可以是任何可hash的對象
【hashtable:一個對象當其聲明周期內(nèi)的hash值不發(fā)生改變勋乾,而且可以跟其他對象進行比較時,這個對象就是hashtable的嗡善〖】 - JSON的key可以是有序、重復的滤奈;dict的key不可重復
- JSON的value只能是字符串摆昧、浮點數(shù)、布爾值或者null蜒程,或者它們構成的數(shù)組或者對象绅你。
- json任意key存在默認值undefined,dict默認沒有默認值昭躺;
- json訪問方式可以是
[]
,也可以是.
忌锯,遍歷方式分in、of领炫;dict的value僅可以下標訪問偶垮。 - json的字符串強制雙引號,dict字符串可以單引號帝洪、雙引號似舵;
- dict可以嵌套tuple,json里只有數(shù)組葱峡。
- json中文必須是unicode編碼砚哗,如“\u6211”
- json的類型是字符串,字典的類型是字典砰奕。
JSON格式與dict轉換
json.loads(json_str)
:json字符串轉換成字典
json.dumps(dict)
:字典轉換成json字符串
2-JSON文件的驗證
為什么要校驗
保證數(shù)據(jù)的安全
客戶端是不可信的蛛芥,如果服務器程序直接將有缺陷的JSON字符串覆蓋回用戶對應的JSON文件里,那么這個用戶可能每次打開以這個賬戶登錄APP都會閃退军援,甚至只能重新申請一個新的賬號仅淑。維護服務器的安全
如果一個惡意攻擊者將一段包含Shell命令的字符串——而不是正確的JSON字符串——傳到了服務器。那么可能他只需用這個賬戶登錄APP就可以獲得服務器的控制權胸哥。
因此涯竟,無論出于哪方面考慮,我們都必須對從客戶端傳到服務器的JSON字符串進行校驗。
JSON Schema
節(jié)選自:https://www.cnblogs.com/superhin/p/11230376.html
對于JSON格式的請求數(shù)據(jù)或者響應數(shù)據(jù)昆禽,在不同的數(shù)據(jù)和場景下往往會有一部分動態(tài)的值及字段蝗蛙。此時我們可以使用JSON Scheme Validator(JSON結構驗證)來驗證JSON的結構,各參數(shù)及嵌套參數(shù)的類型醉鳖,以及必要字段捡硅。
舉例:GET http://httpbin.org/get?a=a
的響應數(shù)據(jù):
{
"args": {
"a": "a"
},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-5fc5ddda-0a9874912db7168035ceee76"
},
"origin": "60.216.115.94",
"url": "http://httpbin.org/get?a=a"
}
我們可以驗證其結構為:
- 整體是一個(類型為)object對象,包含屬性args, headers,origin,url, 必要字段(必須出現(xiàn)的字段)假設為所有
- args類型為object, 包含屬性a, a類型為string
- headers類型為object, 包含屬性Accept, Accept-Encoding,Accept-Language, Host, Upgrade-Insecure-Requests, User-Agent,X-Amzn-Trace-Id, 這些類型都為string
- origin類型為string
- url類型為string
因此使用JSON Schema語法可寫為:
{
"type": "object",
"properties": {
"args": {"type": "object","properties": {"a": {"type": "string"}} },
"hearders": {
"type": "object",
"properties": {
"Accept": {"type": "string"},
"Accept-Encoding": {"type": "string"},
"Accept-Language": {"type": "string"},
"Host": {"type": "string"},
"Upgrade-Insecure-Requests": {"type": "string"},
"User-Agent": {"type": "string"},
"X-Amzn-Trace-Id": {"type": "string"},
},
},
"origin": {"type": "string"},
"url": {"type": "string"},
},
"required": ["args", "headers", "origin", "url"]
}
各類型驗證格式
【object類型】
格式:
{
"type": "object",
"properties": {...}
"required": [....]
}
其中type類型指定為object, properties下寫各個子屬性盗棵,required中填寫必須要出現(xiàn)的元素壮韭,required中未注明的元素可以不出現(xiàn),但出現(xiàn)則必須是限定的類型
【Array類型】
格式:
{
"type": "array",
"items": {...}
"required": [....]
}
其中type類型為array, items下寫各個子項纹因, required中填寫必須要出現(xiàn)的元素喷屋。
【string類型】
{"type": "string"}
【integer類型】
{"type": "integer"}
【boolean類型】
{"type":"boolean"}
詳細可以參考:http://json-schema.org/
Postman中的JSON驗證——tv4使用
選自:https://www.cnblogs.com/superhin/p/11230376.html
https://www.softwaretestingmaterial.com/json-schema-validation-in-postman/
tv4即 Tiny Validator for JSON data的縮寫,微型JSON結構驗證器瞭恰。
在Postman中的使用方法也很簡單屯曹,首先在Tests腳本中根據(jù)響應編寫JSON Schema結構模板,然后使用tv4.validate(jsonData, schema)進行驗證即可.
同樣以GET http://httpbin.org/get?a=a
為例惊畏,Postman中Tests腳本代碼如下:
var schema = {
"type":"object",
"properties":{
"args":{"type":"object","properties":{"a":{"type":"string"}}},
"headers":{
"type":"object",
"properties":{
"Accept":{"type":"string"},
"Accept-Encoding":{"type":"string"},
"Accept-Language":{"type":"string"},
"Host":{"type":"string"},
"Upgrade-Insecure-Requests":{"type":"string"},
"User-Agent":{"type":"string"},
"X-Amzn-Trace-Id":{"type":"string"},
}},
"origin":{"type":"string"},
"url":{"type":"string"},
},
"required":["args","headers","origin","url"]
}
pm.test("Schema is valid", function () {
var jsonData = pm.response.json();
pm.expect(tv4.validate(jsonData,schema)).to.be.true;
});
send后查看斷言恶耽,顯示通過:
現(xiàn)在也可使用工具,自動為JSON數(shù)據(jù)編寫JSON Schema語法:
粘貼JSON數(shù)據(jù)
點擊Submit
它會自動生成對應的schema
復制schema并粘貼到Postaman的Tests模塊中來實現(xiàn)schema驗證
-
同時添加下面的代碼
pm.test("Schema is valid", function () {
pm.response.to.have.jsonSchema(schema)
}); 這樣就為返回數(shù)據(jù)創(chuàng)造了一個JSON schema颜启,Postman會使用它驗證返回的JSON數(shù)據(jù)偷俭,如果返回數(shù)據(jù)與schema設置的值不相符,test就會失敗
如果不想在返回的JSON數(shù)據(jù)中看到?jīng)]有定義過的屬性缰盏,可以在schema中添加一個額外設置:additionalProperties
涌萤,如果將它設置為False,則不支持沒定義過的附加屬性口猜。
舉例:
const schema = {
"type":"object",
"properties":{"code":{"type":"string"}},
"required":["args","headers","origin","url"],
"additionalProperties":false
}