JSON schema验证与Postman脚本示例

1-先熟悉下JSON

节选自:http://www.json.cn/wiki.html
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用独立于编程语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。

json简单说就是javascript中的对象和数组,因此JSON也基于两种结构表示各种复杂结构

  • 对象
    对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。无序。

  • 数组
    数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。有序。

注意
1-JSON中规定key必须使用双引号
2-访问数据可使用点号法

举例:

  {
      "animals": {
          "dog": [
              {
                  "name": "Rufus",
                  "age":15
              },
              {
                  "name": "Marty",
                  "age": null
              }
          ]
      }
  }

python字典与JSON的区别

原文链接:https://blog.csdn.net/u010569893/article/details/97538914
https://blog.csdn.net/qq_36117775/article/details/104226682
字典和JSON的格式很像,都是key:value形式,并且JSON和dict也可以使用dumps与loads相互转换,但它们还是有区别的。

dict是一种数据结构,而JSON那是一种数据格式,作为格式JSON会有很多形式限制,比如必须使用双引号作为边界符号,但字典可以使用单引号也可以使用双引号。

dict作为完整的数据结构,是对Hash Table这一数据结构的一种实现,是一套从存储到提取都封装好了的方案。

  • JSON的key只能是字符串,dict可以是任何可hash的对象
    【hashtable:一个对象当其声明周期内的hash值不发生改变,而且可以跟其他对象进行比较时,这个对象就是hashtable的。】
  • JSON的key可以是有序、重复的;dict的key不可重复
  • JSON的value只能是字符串、浮点数、布尔值或者null,或者它们构成的数组或者对象。
  • json任意key存在默认值undefined,dict默认没有默认值;
  • json访问方式可以是[],也可以是.,遍历方式分in、of;dict的value仅可以下标访问。
  • json的字符串强制双引号,dict字符串可以单引号、双引号;
  • dict可以嵌套tuple,json里只有数组。
  • json中文必须是unicode编码,如“\u6211”
  • json的类型是字符串,字典的类型是字典。

JSON格式与dict转换
json.loads(json_str) :json字符串转换成字典
json.dumps(dict):字典转换成json字符串

2-JSON文件的验证

为什么要校验

  • 保证数据的安全
    客户端是不可信的,如果服务器程序直接将有缺陷的JSON字符串覆盖回用户对应的JSON文件里,那么这个用户可能每次打开以这个账户登录APP都会闪退,甚至只能重新申请一个新的账号。

  • 维护服务器的安全
    如果一个恶意攻击者将一段包含Shell命令的字符串——而不是正确的JSON字符串——传到了服务器。那么可能他只需用这个账户登录APP就可以获得服务器的控制权。

因此,无论出于哪方面考虑,我们都必须对从客户端传到服务器的JSON字符串进行校验。

JSON Schema

节选自:https://www.cnblogs.com/superhin/p/11230376.html
对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段。此时我们可以使用JSON Scheme Validator(JSON结构验证)来验证JSON的结构,各参数及嵌套参数的类型,以及必要字段。

举例:GET http://httpbin.org/get?a=a的响应数据:

  {
    "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, 必要字段(必须出现的字段)假设为所有
  • 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中填写必须要出现的元素,required中未注明的元素可以不出现,但出现则必须是限定的类型

【Array类型】
格式:

{
"type": "array",
"items": {...}
"required": [....]
}

其中type类型为array, items下写各个子项, required中填写必须要出现的元素。

【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脚本中根据响应编写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

现在也可使用工具,自动为JSON数据编写JSON Schema语法:

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

  • 粘贴JSON数据

  • 点击Submit

  • 它会自动生成对应的schema

  • 复制schema并粘贴到Postaman的Tests模块中来实现schema验证

  • 同时添加下面的代码

    pm.test("Schema is valid", function () {
    pm.response.to.have.jsonSchema(schema)
    });

  • 这样就为返回数据创造了一个JSON schema,Postman会使用它验证返回的JSON数据,如果返回数据与schema设置的值不相符,test就会失败

如果不想在返回的JSON数据中看到没有定义过的属性,可以在schema中添加一个额外设置:additionalProperties,如果将它设置为False,则不支持没定义过的附加属性。

举例:

  const schema = {
      "type":"object",
      "properties":{"code":{"type":"string"}},
      "required":["args","headers","origin","url"],
      "additionalProperties":false
  }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容