【点点点】JsonSchema的使用

1、在线使用验证:http://json-schema-validator.herokuapp.com/,如下验证:

Schema:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "status": {
      "type": "integer"
    },
    "msg": {
      "type": "string"
    },
    "sign": {
      "type": "string"
    },
    "data": {
      "type": "object",
      "properties": {
        "deviceId": {
          "type": "string"
        },
        "secret": {
          "type": "string"
        }
      },
      "required" : [
        "deviceId",
        "secret"
      ]
    }
  },
  "required": ["status","msg","sign","data"]
}

 

验证的数据Data:

{
    "data": {
        "deviceId": "881e576789c87da7db02a9680f3a743d",
        "secret": "b7d36f737021a9d85c297d10a433a46f"
    },
    "msg": "成功",
    "sign": "a6828b8987cd39faa35d75e55f7c5b3b523984795d8a63b681379ddac9e32605",
    "status": 1000
}

 

2、Json Schema是定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达。Json元数据定义了Json数据需要满足的规范(一般通过关键字,有些关键字是调用的,一些关键字是针对类型的,有些是描述的),规范包括:成员、结构、类型和约束等。

来自:https://www.cnblogs.com/terencezhou/p/10474617.html

3、类型关键字

  1. {"type":"string"}。规定了Json数据必须是一个字符串
  2. {"type" : "object"}。规定了Json数据必须是一个对象
  3. {"type" : "number"}。规定了Json数据必须是一个数值,符合要求的数据可以是。Java Script不区分整数、浮点数,但是Json Schema可以区分
  4. {"type": "integer"}。要求数据必须是整数
  5. {"type" : "array"}。规定了Json数据必须是一个数组
  6. {"type" : "boolean"}。这个Json Schema规定了Json数据必须是一个布尔,只有两个合法值
  7. {"type" : "null"}。null类型只有一个合法值

4、简单类型

  1. 字符串-长度,可以对字符串的最小长度、最大长度做规范。关键字:minLength、maxLength。如:{"type":"string","minLength":2,"maxLength":3}
  2. 字符串-正则表达式,可以对字符串应满足的Pattern做规范,Pattern通过正则表达式描述,关键字:pattern。如:{"type":"string","pattern":"^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"}
  3. 字符串-格式化,可以通过Json Schema内建的一些类型,对字符串的格式做规范,如:电子邮件、日期等("date", "time", "date-time", "email", "hostname"等)。如:{"type":"string","format":"date"}
  4. 数值,包括:number和integer
  5. 数值-满足倍数,可以要求数值必须是某个特定值的整数倍。{"type":"number","multipleOf":10}
  6. 数值-范围,可以限制数值的方位,包括:最大值、最小值、开区间最大值、开区间最小值,要求数值在[0,100)。如:{"type":"number","minimum":0,"exclusiveMaximum":100}
  7. 布尔,布尔类型无额外的类型特定参数
  8. 空置,null类型无额外的类型特定参数

5、复合类型

1、数组,可以用来限制成员类型、是否允许额外成员、最小元素个数、最大元素个数、是否允许元素重复

2、数组-要求数组内每个成员是某种类型,关键字:items。

3、数组中的所有元素都是数值 如:[1, 2, 3]    {"type":"array","items":{"type":"number"}}。

4、关键字items还可以对应一个数组,如:[1, "abc"]   {"type":"array","items":[{"type":"number"},{"type":"string"}]}

5、数组是否允许额外成员,关键字:additionalItems。当使用了items关键字,且items关键字对应的是Schema数组,这才起作用。关键字additionalItems规定Json数组内的元素,除了一一匹配items数组内的Schema外,是否允许多余的元组。当additionalItems为true时,允许额外元素。

[1, "abc", "x"]

{
    "type": "array",
    "items": [
    {
        "type": "number"
    },
    {
        "type": "string"
    }],
    "additionalItems" : true
}

 

6、数组元素个数,可以限制数组内元素个数。关键字:minItems,maxItems

[1,2,3,4,5,6]

{
    "type": "array",
    "items": {
        "type": "number"
    },
    "minItems" : 5,
    "maxItems" : 10
}

 

7、数组内元素是否必须唯一,规定数组内元素是否必须唯一。关键字:uniqueItems

[1,2,3,4,5]

{
    "type": "array",
    "items": {
        "type": "number"
    },
    "uniqueItems" : true
}

 

 6、对象

1、Json对象是常见的Json数据类型,最基本的类型限制Schema是:{"type" : "object"}

2、成员的Schema,规定对象各成员应遵守的Schema,关键字:properties。其是key/value结构的字典,key对应Json数据的key,value是key对应的值应遵守的JsonSchema。

{
    "name": "Froid",
    "age" : 26,
    "address" : {
        "city" : "New York",
        "country" : "USA"
    }
}
{ 
    "type": "object",     
    "properties": {      
        "name": {"type" : "string"},
        "age" : {"type" : "integer"},
        "address" : {
            "type" : "object",
            "properties" : {
                "city" : {"type" : "string"},
                "country" : {"type" : "string"}
            }
        }
    }
}

 

3、批量成员定义Schema,与properties一样,但key通过正则表达式匹配属性名

{"S_1" : "abc"}

{"S_1" : "abc", "I_3" : 1}

{
    "type": "object",
    "patternProperties": {
        "^S_": { "type": "string" },
        "^I_": { "type": "integer" }
    }
}

 

4、必须出现的成员,规定哪些成员对象是必须的,关键字:required

合法的数据:

{"name" : "mary", "age" : 26}

{"name" : "mary"}

不合法的数据:

{"age" : 26}

{ 
    "type": "object",     
    "properties": {      
        "name": {"type" : "string"},
        "age" : {"type" : "integer"},
    },
    "required" : ["name"]
}

 

5、成员依赖关系,规定某些成员的依赖成员,不能在依赖成员缺席的情况下单独出现,属于数据完整性方面的约束。关键字:dependencies(dependencies也是一个字典结构,key是Json数据的属性名,value是一个数组,数组内也是Json数据的属性名,表示key必须依赖的其他属性。)

合法的数据:

{}

{"billing_address" : "abc"}

不合法是数据:

{"credit_card": "7389301761239089"}

{
    "type": "object",
    "dependencies": {
        "credit_card": ["billing_address"]
    }
}

 

6、属性个数的限制,规定最少、最多有几个属性成员,关键字:minProperties, maxProperties

合法的数据:

{"name" : "mary", "age" : 26}

{"name" : "mary", "age" : 26, "phone" : "37839233"}

{
    "type": "object",
    "minProperties": 2,
    "maxProperties": 3
}

 

 7、逻辑组合

1、满足所有、满足任意、满足一个,关键字:allOff,anyOf,oneOf,not

2、后续补充...

8、复杂结构

1、对复杂结构的支持包括定义和引用。可以将相同的结果定义成一个“类型”,需要使用“类型”时,可以通过其路径或id来引用。

2、定义一个类型,并不需特殊的关键字。通常的在root节点的definations下面,定义需要多次引用的schema。definations是一个json对象,key是想要定义的“类型”的名称,value是一个json schema。

定义了一个address的schema,并且在其中引用,#/definitions/address表示从根节点开始的路径。

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

 

3、上面的定义中加入id属性,可通过id属性的值对schema进行引用,不需要完整的路径。

4、在使用需要使用json schema的地方,可使用关键字$ref。

关键字$ref可以用在任何需要使用json schema的地方。如上例中,billing_address的value应该是一个json schema,通过一个$ref替代了。$ref的value,是该schema的定义在json中的路径,以#开头代表根节点。

{
    "properties": {
        "billing_address": { "$ref": "#/definitions/address" },
        "shipping_address": { "$ref": "#/definitions/address" }
    }
}

如果schema定义了$id属性,也可以通过该属性的值进行引用。

{
    "properties": {
        "billing_address": { "$ref": "#address" },
        "shipping_address": { "$ref": "#address" }
    }
}

 

9、通用关键字

通用关键字可在任何json schema中出现,有些影响合法性校验,有些描述作用,不影响合法性校验。

1、关键字:enum,可在任何json schema中出现,value是一个list,表示json数据的取值只能是list中的某个。

{
    "type": "string",
    "enum": ["red", "amber", "green"]
}

 

2、关键字:title,description,default,example,只作为描述作用,不影响对数据的校验。

{
    "title" : "Match anything",
    "description" : "This is a schema that matches anything.",
    "default" : "Default value",
    "examples" : [
        "Anything",
        4035
    ]
}

 

posted @ 2022-03-28 22:41  站在围墙上的白白  阅读(768)  评论(0)    收藏  举报