• 【点点点】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
        ]
    }
  • 相关阅读:
    程序员职业规划
    SSH框架优缺点
    Servlet的生命周期,并说出Servlet和CGI的区别,Servlet与JSP的区别
    什么是J2EE,包括哪些规范!
    JS中定义类的方法
    audio.js – 随时随地,播放 HTML5 的声音
    jquery面试题里 缓存问题如何解决?
    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
    JAVA排序算法
    java面试题中常见的关于String类问题总结
  • 原文地址:https://www.cnblogs.com/shuozhang/p/16064981.html
Copyright © 2020-2023  润新知