Json schema总结

简介: Json schema总结

   json schema主要用来验证json的格式,在测试过程中的返回格式验证上面,涉及比较多,下面就来做一个总结性的说明和介绍。

1. json的结构类型

   如下图,json有以下几种数据结构,而json shema的验证也是基于这几种结构来进行验证:

  • object:
{ "key1": "value1", "key2": "value2" }

array:

[ "first", "second", "third" ]

number:

42
3.1415926

string:

"This is a string"

boolean:

true
false

null:

null

2. 示例介绍

   1)schema校验格式

{
  "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" }
      }
    }
  }
}

   2)返回错误的校验

{
  "name": "George Washington",
  "birthday": "February 22, 1732",
  "address": "Mount Vernon, Virginia, United States"
}

   3)返回正确的校验

{
  "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"
  }
}

   4)详解

如示例所示,schema类型定义了一个完整的json校验格式,以及其中细分的属性校验。
例如,定义first_name、last_name字段为string类型,而错误的示例,则没有相应的字段
定义birthday为date类型,如正确的示例,而错误的示例虽然字段名一致,但类型校验未通过。

   通过上面的说明,可以明确json schema是对json数据的一种校验和约束,可以很方便的判断某个json是否符合自定义的格式要求。


3. 高级应用

   通过上面的例子可以知道,json schema用起来比较方便,可以深入到每个字段层级进行定义,但是假如遇到庞大数量的json,如果要挨个校验,未免会有些过于繁琐,于是可以想到相对应的,有没有可替代的方式,答案当然是有的:

  1)重用

       定义如下schema的校验:

{
  "type": "object",
  "properties": {
    "street_address": { "type": "string" },
    "city":           { "type": "string" },
    "state":          { "type": "string" }
  },
  "required": ["street_address", "city", "state"]
}

       使用上述schema的引用:

{ "$ref": "definitions.json#/address" }

       重用上述schema:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "address": {
      "type": "object",
      "properties": {
        "street_address": { "type": "string" },
        "city":           { "type": "string" },
        "state":          { "type": "string" }
      },
      "required": ["street_address", "city", "state"]
    }
  },
  "type": "object",
  "properties": {
    "billing_address": { "$ref": "#/definitions/address" },
    "shipping_address": { "$ref": "#/definitions/address" }
  }
}

      以下结果便可以通过校验:

{
  "shipping_address": {
    "street_address": "1600 Pennsylvania Avenue NW",
    "city": "Washington",
    "state": "DC"
  },
  "billing_address": {
    "street_address": "1st Street SE",
    "city": "Washington",
    "state": "DC"
  }
}

     2)递归重用

       schema示例:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "person": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "children": {
          "type": "array",
          "items": { "$ref": "#/definitions/person" },
          "default": []
        }
      }
    }
  },
  "type": "object",
  "properties": {
    "person": { "$ref": "#/definitions/person" }
  }
}

       对应的校验示例:

{
  "person": {
    "name": "Elizabeth",
    "children": [
      {
        "name": "Charles",
        "children": [
          {
            "name": "William",
            "children": [
              { "name": "George" },
              { "name": "Charlotte" }
            ]
          },
          {
            "name": "Harry"
          }
        ]
      }
    ]
  }
}

   3)组合模式

  • anyof(符合任一条件)
{
  "anyOf": [
    { "type": "string", "maxLength": 5 },
    { "type": "number", "minimum": 0 }
  ]
}

   校验结果:

正确的校验:
"hello"
3
错误校验:
"ehqijosjqiehcduw"
-1

allof(符合所有条件)

{
  "allOf": [
    { "type": "string" },
    { "maxLength": 5 }
  ]
}

   校验结果:

正确结果:
"hello"
错误结果:
123

oneof(其中之一符合,不包含全部,仅选其一)

{
  "oneOf": [
    { "type": "number", "multipleOf": 5 },
    { "type": "number", "multipleOf": 3 }
  ]
}

      校验结果:

正确结果:
9
10
错误结果:
2
15

not(不符合)

{ "not": { "type": "string" } }

     校验结果:

正确结果:
9
错误结果:
"hello"

   4)混合使用

{
  "definitions": {
    "address": {
      "type": "object",
      "properties": {
        "street_address": { "type": "string" },
        "city":           { "type": "string" },
        "state":          { "type": "string" }
      },
      "required": ["street_address", "city", "state"]
    }
  },
  "allOf": [
    { "$ref": "#/definitions/address" },
    { "properties": {
        "type": { "enum": [ "residential", "business" ] }
      }
    }
  ]
}

   正确校验:

{
   "street_address": "1600 Pennsylvania Avenue NW",
   "city": "Washington",
   "state": "DC",
   "type": "business"
}

   以上便是json shema的用法总结,欢迎关注交流~

相关文章
|
6月前
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
|
JSON 前端开发 JavaScript
这些前端新技术你很难再忽视了 —— JSON Schema
这些前端新技术你很难再忽视了 —— JSON Schema
|
JSON Java Linux
知识分享之Golang——JSON Schema书籍分享
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
182 0
知识分享之Golang——JSON Schema书籍分享
|
存储 JSON IDE
规范你的 JSON 配置,试试 JSON schema
不知道大家在写一些 JSON 配置时会不会经常觉得麻烦,每次都要打开文档去核对字段名称对不对、结尾有没有 s、结构是否正确、是不是数组等问题。然而我最近发现一些开源项目生成的配置文件中都开始使用 JSON schema 来规范配置文件,IDE 也会对 JSON 配置进行提示和检查,真香。本文介绍下 JSON schema 的使用方法和使用场景。
|
XML JSON JavaScript
手把手教你通过JSON Schema判断BpmnJS元素属性结构~
手把手教你通过JSON Schema判断BpmnJS元素属性结构~
414 0
|
JSON Java 测试技术
技术分享 | 接口自动化测试之JSON Schema模式该如何使用?
JSON Schema 模式是一个词汇表,可用于注释和验证 JSON 文档。在实际工作中,对接口返回值进行断言校验,除了常用字段的断言检测以外
技术分享 | 接口自动化测试之JSON Schema模式该如何使用?
|
JSON 移动开发 数据可视化
我和JSON Schema的那些事
哈喽,我是🌲 树酱。今天聊一聊关于我跟Json schema的一些交集,顺便给大家重新梳理下今日这个主角的概念及当下主要的一些应用场景
482 0
我和JSON Schema的那些事
|
JSON 数据格式 Shell
json schema校验
工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下。 json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, object, number, string等等 2.
2168 0
|
XML JSON JavaScript
JSON 模式(Schema)与数据解析
JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范 JSON 模式用于描述现有数据格式,干净的人类和机器可读的文档,完整的结构验证,有利于自动化测试,可用于验证客户端提交的数据
5925 0
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
下一篇
DataWorks