JSON schema驗證與Postman腳本示例

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后查看斷言恶耽,顯示通過:


JSONSchema驗證.png

現(xiàn)在也可使用工具,自動為JSON數(shù)據(jù)編寫JSON Schema語法:

  • 打開https://jsonschema.net/home

  • 粘貼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
  }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末负溪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子济炎,更是在濱河造成了極大的恐慌笙以,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冻辩,死亡現(xiàn)場離奇詭異,居然都是意外死亡拆祈,警方通過查閱死者的電腦和手機恨闪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來放坏,“玉大人咙咽,你說我怎么就攤上這事∮倌辏” “怎么了钧敞?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵蜡豹,是天一觀的道長。 經(jīng)常有香客問我溉苛,道長镜廉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任愚战,我火速辦了婚禮娇唯,結果婚禮上,老公的妹妹穿的比我還像新娘寂玲。我一直安慰自己塔插,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布拓哟。 她就那樣靜靜地躺著想许,像睡著了一般。 火紅的嫁衣襯著肌膚如雪断序。 梳的紋絲不亂的頭發(fā)上流纹,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音逢倍,去河邊找鬼捧颅。 笑死,一個胖子當著我的面吹牛较雕,可吹牛的內(nèi)容都是我干的碉哑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亮蒋,長吁一口氣:“原來是場噩夢啊……” “哼扣典!你這毒婦竟也來了?” 一聲冷哼從身側響起慎玖,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贮尖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后趁怔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湿硝,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年润努,在試婚紗的時候發(fā)現(xiàn)自己被綠了关斜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡铺浇,死狀恐怖痢畜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤丁稀,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布吼拥,位于F島的核電站,受9級特大地震影響线衫,放射性物質發(fā)生泄漏凿可。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一桶雀、第九天 我趴在偏房一處隱蔽的房頂上張望矿酵。 院中可真熱鬧,春花似錦矗积、人聲如沸全肮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辜腺。三九已至,卻和暖如春乍恐,著一層夾襖步出監(jiān)牢的瞬間评疗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工茵烈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留百匆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓呜投,卻偏偏與公主長得像加匈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仑荐,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容