搜索内容

有一个问题?

如果您有任何疑问,可以在下面询问或输入您要寻找的!

JSON Schema 是什么?

生成海报
西西爸de札记
西西爸de札记 2021-01-26 00:12
阅读需:0

全文详细地址: https://www.jianshu.com/p/1711f2f24dcf

JsonSchema官方网文本文档新手入门文本文档新手入门文本文档形成Schema专用工具

应用Json的益处(什么叫Schema):

  • 叙述目前的数据类型
  • 出示清楚的人力和设备可读文本文档
  • 详细的算法设计,有益于功能测试
  • 详细的算法设计,有益于认证手机客户端递交数据信息的品质

什么叫JSON Schema

  • JSON Schema本身便是一种算法设计,能够清楚的叙述JSON数据信息的构造。是一种叙述JSON数据信息的JSON数据信息。

应用JSON Schema的益处

  • JSON Schema 十分适用根据JSON的HTTP的API。
  • JSON Schema从Java的基础基本数据类型中对JSON构造开展校检,因此 对JSON构造的校检能够了解为对每个不一样基本数据类型的相对校检。
  • 接口测试中能够迅速的精准定位到自身数据类型的准确性。

JSON方式实例

{ "$schema":"", "title":"book info", "description":"some information about book", "type":"object", "properties":{ "id":{ "description":"The unique identifier for a book", "type":"integer", "minimum":1 }, "name":{ "type":"string", "pattern":"^#([0-9a-fA-F]{6}$", "maxLength":6, "minLength":6 }, "price":{ "type":"number", "multipleOf":0.5, "maximum":12.5, "exclusiveMaximum":true, "minimum":2.5, "exclusiveMinimum":true }, "tags":{ "type":"array", "items":[ { "type":"string", "minLength":5 }, { "type":"number", "minimum":10 } ], "additionalItems":{ "type":"string", "minLength":2 }, "minItems":1, "maxItems":5, "uniqueItems":true } }, "minProperties":1, "maxProperties":5, "required":[ "id", "name", "price" ] }

关键词表明

JOSN方式中常见的关键词(加粗字体为常用汉字段)

Untitled

申明JSON方式

因为JSON Schema本身便是JSON,因此 当一些物品是JSON Schema或是仅仅JSON的随意一块时,并不一直非常容易辨别。该

https://math.jianshu.com/math?formula=schema关键词用以申明一些內容是JSON Schema,

schema设定schema所应用的参考规范。包括它一般 是一种非常好的作法,虽然并不是必不可少的。

{ "$schema": "" }

申明唯一标志符(不明白)

最好作法是将$id特性包括为每一个方式的唯一标志符。如今,只需将其设定为您操纵的域中的URL,比如:

{ "$id": ""}

type普遍赋值

Type实际上便是JSON数据信息的基础基本数据类型,一般是有6种,再加上null一现有7种:

Untitled


type:Object

实例:

{ "type":"object", "properties":{ "id":{ "description":"The unique identifier for a book", "type":"integer", "minimum":1 }, "price":{ "type":"number", "minimum":0, "exclusiveMinimum":true } }, "patternProperties":{ "^a":{ "type":"number" }, "^b":{ "type":"string" } }, "additionalProperties":{ "type":"number" }, "minProperties":1, "maxProperties":5, "required":[ "id", "name", "price" ] }

object种类有三个关键词:type(限制种类),properties(界定object的每个字段名),required(限制必不可少字段名)

Untitled

minProperties、maxProperties表明(用的并不是许多 )

这两个关键词的值全是非负整数。待校检的JSON目标中一级key的数量限定,minProperties特定了待校检的JSON目标能够接纳的至少一级key的数量,maxProperties特定了待校检JSON目标能够接纳的数最多一级key的数量

patternProperties

正则表达式配对json出現的特性,该JSON目标的每一个一级key全是一个正则表达式,用于配对value值。

仅有待校检JSON目标中的一级key,根据与之配对的patternProperties中的一级正则表达式,相匹配的JSON Schema的校检,才算根据校检。比如,假如patternProperties相匹配的值以下:

在待校检JSON目标中,全部以S开始的key的value都务必是number,全部以I开始的一级key的value都务必是string。

{ "patternProperties": { "^S_": { "type": "number" }, "^I": { "type": "string" } } }


type:array

实例:

{ "$schema": "", "title": "Product", "description": "A product from Acme's catalog", { "type":"array", "items":[ { "type":"string", "minLength":5 }, { "type":"number", "minimum":10 } ], "additionalItems":{ "type":"string", "minLength":2 }, "minItems":1, "maxItems":5, "uniqueItems":true }

array有三个独立的特性:items,minItems,uniqueItems:

Untitled

items

该关键词的值是一个合理的JSON Schema或是一组合理的JSON Schema。

{ "type": "array", "items": { "type": "string", "minLength": 5 } }

上边的JSON Schema的意思是,待校检JSON数组的原素全是string种类,且最少可接纳长短是5。那麼下边这一JSON数组显著是符合规定的,主要内容以下:["myhome", "green"]下边这一JSON数组显著不符合规定["home", "green"]

当该关键词的值是一组合理的JSON Schema时,仅有待校检JSON数组的全部原素根据items的值中相匹配部位上的JSON Schema的校检,那麼,全部待校检JSON数组才算根据校检。

这儿必须留意的是:假如items界定的合理的JSON Schema的总数和待校检JSON数组中原素的总数不一致,那麼就需要选用“取小标准”。即,假如items界定了3个JSON Schema,可是待校检JSON数组仅有两个原素,这时候,只需待校检JSON数组的前2个原素可以各自根据items中的前2个JSON Schema的校检,那麼,大家觉得待校检JSON数组根据了校检。而,假如待校检JSON数组有4个原素,这时候,只需待校检JSON数组的前三个原素可以根据items中相匹配的JSON Schema的校检,大家就觉得待校检JSON数组根据了校检。比如,假如items的值以下:

{ "type":"array", "items":[ { "type":"string", "minLength":5 }, { "type":"number", "minimum":10 }, { "type":"string" } ] }

上边的JSON Schema强调了待校检JSON数组应当考虑的标准,数组的第一个原素是string种类,且最少可接纳长短为5,数组的第二个原素是number种类,最少可接纳的数值10,数组的第三个原素是string种类。那麼下边这两个JSON数组显著是符合规定的,主要内容以下:["green", 10, "good"]["helloworld", 11]下边这两个JSON数组确是不符合规定的,主要内容以下:["green", 9, "good"]//9低于minimum["good", 12]//good低于minLength

additionalItems

该关键词的值是一个合理的JSON Schema。

必须留意的是,该关键词仅有在items关键词的数值一组合理的JSON Schema的情况下,才能够应用,用以要求超过items中JSON Schema总总数以外的待校检JSON数组中的剩下的原素应当考虑的校检逻辑性。仅有这种剩下的全部原素都考虑additionalItems的规定时,待校检JSON数组才算根据校检。

能够那么了解,当items的数值一组合理的JOSN Schema的情况下,一般能够和additionalItems关键词组成应用,items用以要求相匹配部位上应当考虑的校检逻辑性,而additionalItems用以要求超过items校检范畴的全部剩下原素应当考虑的标准。假如二者另外存有,那麼仅有待校检JSON数组另外根据二者的校检,才算真实地根据校检。

此外,必须留意的是,假如items仅仅一个合理的JSON Schema,那麼就不可以应用additionalItems,缘故也非常简单,由于items为一个合理的JSON Schema的情况下,其要求了待校检JSON数组全部原素应当考虑的校检逻辑性。additionalItems早已沒有立足之地了。

注重一下,省去该关键词和该关键词的数值空JSON Schema,具备同样实际效果。

{ "type": "array", "items": [ { "type": "string", "minLength": 5 }, { "type": "number", "minimum": 10 } ], "additionalItems": { "type": "string", "minLength": 2 } }

上边的JSON Schema的意思是,待校检JSON数组第一个原素是string种类,且可接纳的最少长短为五个标识符,第二个原素是number种类,且可接纳的极小值为10,剩下的别的原素是string种类,且可接纳的最少长短为2。那麼,下边三个JSON数组是可以根据校检的,主要内容以下:["green", 10, "good"]["green", 11]["green", 10, "good", "ok"]下边JSON数组是没法根据校检的,主要内容以下:["green", 10, "a"]["green", 10, "ok", 2]

minItems、maxItems

这两个关键词的值全是非负整数。

特定了待校检JSON数组中原素的数量限定,minItems特定了待校检JSON数组能够接纳的至少原素数量,而maxItems特定了待校检JSON数组能够接纳的数最多原素数量。

此外,必须留意的是,省去minItems关键词和该关键词的数值0,具备同样实际效果。而,假如省去maxItems关键词则表明对原素的较大 数量沒有限定。比如,假如限定一个JSON数组的原素的较大 数量为5,最少数量为1,则JSON Schema以下:"minItems": 1,"maxItems": 5

uniqueItems

该关键词的值是一个布尔值,即boolean(true、false)。

当该关键词的数值true时,仅有待校检JSON数组中的全部原素都具备唯一性时,才可以根据校检。当该关键词的数值false时,一切待校检JSON数组都能根据校检。

此外,必须留意的是,省去该关键词和该关键词的数值false时,具备同样的实际效果。比如:"uniqueItems": true

contains

留意:该关键词,官方网表明中适用,可是,有可能你应用的服务平台或是第三方专用工具不兼容。因此 ,应用需慎重。

该关键词的值是一个合理的JSON Schema。

仅有待校检JSON数组中最少有一个原素可以根据该关键词特定的JSON Schema的校检,全部数组才算根据校检。

此外,必须留意的是,省去该关键词和该关键词的数值空JSON Schema具备同样实际效果。


type:string

实例

{ "$schema":"", "title":"Product", "description":"A product from Acme's catalog", "type":"object", "properties":{ "ip":{ "type":"string", "pattern":"w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*" }, "host":{ "type":"phoneNumber", "pattern":"((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*" }, "email":{ "type":"string", "format":"email" } }, "required":[ "ip", "host" ] }

Untitled

format该关键词的值只有是下列赋值:date-time(时间格式)、email(邮件格式)、hostname(网址文件格式)、ipv4、ipv6、uri、uri-reference、uri-template、json-pointer。假如待校检的JSON原素恰好是一个邮件地址,那麼,大家就可以应用format关键词开展校检,而无须根据pattern关键词特定繁杂的正则表达式开展校检。


type:integer or number

实例

{ "$schema":"", "title":"Product", "description":"A product from Acme's catalog", "type":"object", "properties":{ "price":{ "type":"number", "multipleOf":0.5, "maximum":12.5, "exclusiveMaximum":true, "minimum":2.5, "exclusiveMinimum":true } }, "required":[ "price" ] }

integer和number的差别,integer等同于Java中的int类型,而number等同于Java中的int或float种类。number 关键词能够叙述随意长短,随意小数位的数据。

Untitled

multipleOf

该关键词的值是一个超过0的number,即能够是超过0的int,还可以是超过0的float。仅有待校检的值可以被该关键词的值整除,才算根据校检。假如带有该关键词的JSON Schema以下{ "type": "integer", "multipleOf": 2 }2、4、6全是能够根据校检的,可是,3、5、7全是没法根据校检的,当然,2.0、4.0也是没法根据校检的,可是,并并不是由于multipleOf关键词,只是由于type关键词。假如带有multipleOf关键词的JSON Schema以下{ "type": "number", "multipleOf": 2.0 }2、2.0、4、4.0全是能够根据校检的,可是,3、3.0、3、3.0全是没法根据校检的。此外,必须留意的是,省去该关键词则不看待校检标值开展此项校检。

maximum

该关键词的值是一个number,即能够是int,还可以是float。该关键词要求了待校检原素能够根据校检的最高值。省去该关键词,即表明看待校检原素的最高值沒有规定

exclusiveMaximum

该关键词的值是一个boolean。该关键词一般 和maximum一起应用,当该关键词的数值true时,表明待校检原素务必低于maximum特定的值;当该关键词的数值false时,表明待校检原素能够低于或是相当于maximum特定的值。必须留意的是,省去该关键词和该关键词的数值false,具备同样实际效果。比如:{ "type": "number", "maximum": 12.3, "exclusiveMaximum": true }

minimum、exclusiveMinimum

minimum、exclusiveMinimum关键词的使用方法和含意与maximum、exclusiveMaximum类似。唯一的差别取决于,一个管束了待校检原素的极小值,一个管束了待校检原素的最高值。


type:boolean

相匹配着true或是false

{ "type":"object", "properties":{ "number":{ "type":"boolean" } } }

升阶

type:enum

该关键词的值是一个数组,该数组最少要有一个原素,且数组内的每一个原素全是唯一的。

假如待校检的JSON原素和数组中的某一个原素同样,则根据校检。不然,没法根据校检。

留意,该数组中的原素值能够是一切值,包含null。省去该关键词则表明不必看待校检原素开展此项校检。

{ "type":"object", "properties":{ "street_type":{ "type":"string", "enum":[ "Street", "Avenue", "Boulevard" ] } } }

{ "type":"object", "properties":{ "street_type":[ "Street", "Avenue", "Boulevard" ] } }

type:const

该关键词的值能够是一切值,包含null。假如待校检的JSON原素的值和该关键词特定的值同样,则根据校检。不然,没法根据校检。省去该关键词则表明不必看待校检原素开展此项校检。留意,该关键词一部分第三方专用工具,并不兼容

关键词:$ref

用于引入别的的schema实例:

{ "$schema": "", "title": "Product set", "type": "array", "items": { "title": "Product", "type": "object", "properties": { "id": { "description": "The unique identifier for a product", "type": "number" }, "name": { "type": "string" }, "price": { "type": "number", "minimum": 0, "exclusiveMinimum": true }, "tags": { "type": "array", "items": { "type": "string" }, "minItems": 1, "uniqueItems": true }, "dimensions": { "type": "object", "properties": { "length": {"type": "number"}, "width": {"type": "number"}, "height": {"type": "number"} }, "required": ["length", "width", "height"] }, "warehouseLocation": { "description": "Coordinates of the warehouse with the product", "$ref": "" } }, "required": ["id", "name", "price"] } }

关键词definitions

当一个schema写的非常大的情况下,很有可能必须建立内部构造体,再应用$ref开展引入,示列以下:

{ "type": "array", "items": { "$ref": "#/definitions/positiveInteger" }, "definitions": { "positiveInteger": { "type": "integer", "minimum": 0, "exclusiveMinimum": true } } }

关键词:allOf

该关键词的值是一个非空数组,数组里边的每一个原素都务必是一个合理的JSON Schema。仅有待校检JSON原素根据数组中全部的JSON Schema校检,才算真实根据校检。意思是展现所有特性,提议用requires取代,不建议应用,实例以下

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

关键词:anyOf

该关键词的值是一个非空数组,数组里边的每一个原素都务必是一个合理的JSON Schema。假如待校检JSON原素可以根据数组中的任何一个JSON Schema校检,即使根据校检。意思是展现随意特性,提议用requires取代和minProperties取代,实例以下:

{ "anyOf":[ { "type":"string" }, { "type":"number" } ] }

关键词:oneOf

该关键词的值是一个非空数组,数组里边的每一个原素都务必是一个合理的JSON Schema。假如待校检JSON原素能且只有根据数组中的某一个JSON Schema校检,才算真实根据校检。不可以根据一切一个校验和能根据2个及之上的校检,都算不上真实根据校检。在其中之一

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

关键词:not

该关键词的值是一个JSON Schema。仅有待校检JSON原素不可以根据该关键词特定的JSON Schema校检的情况下,待校检原素才算根据校检。非 * 种类

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

关键词:default

必须需注意的是,type关键词的值能够是一个string,还可以是一个数组。假如type的值是一个string,则其值只有是下列几类:null、boolean、object、array、number、string、integer。假如type的值是一个数组,则数组中的原素都务必是string,且其赋值依然被限制为之上几类。只需带校检JSON原素是在其中的一种,则根据校检。



大家新项目怎样集成化JSON Schema

  1. 引进JSON Schema的依靠

io.rest-assuredjson-schema-validator3.1.1

  1. 加上2个工具箱ReadJsonFile,JsonValidateUtilReadJsonFile:从/src/main/resources文件目录中载入json文档JsonValidateUtil:校检json数据信息是不是合乎schema承诺的标准文件1:ReadJsonFile

`package com.mfw.flight.platform.server.util;

import com.fasterxml.jackson.databind.JsonNode; import com.github.fge.jackson.JsonNodeReader;

import java.io.*;

/**

  • @Author: sunshaokang

  • @Date: 2018/12/29 早上11:23 / public class ReadJsonFile { /*

    • 载入Json文档为String json
    •  
    • @param filePath filePath为文档的相对性于resources的途径
    • @return */ public static String readJsonFileAsString(String filePath) { filePath = ReadJsonFile.class.getResource(filePath).getPath(); String jsonStr = ""; try { File jsonFile = new File(filePath); FileReader fileReader = new FileReader(jsonFile); Reader reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8"); int ch = 0; StringBuffer sb = new StringBuffer(); while ((ch = reader.read()) != -1) { sb.append((char) ch); } fileReader.close(); reader.close(); jsonStr = sb.toString(); return jsonStr; } catch (IOException e) { e.printStackTrace(); return null; } }

    /**

    • 载入Json文档为JsonNode
    •  
    • @param filePath filePath为文档的相对路径
    • @return */ public static JsonNode readJsonFileAsJsonNode(String filePath) { JsonNode instance = null; try { instance = new JsonNodeReader().fromReader(new FileReader(filePath)); } catch (IOException e) { e.printStackTrace(); } return instance; } }`

文档2:JsonValidateUtil

`package com.mfw.flight.platform.server.util;

import com.fasterxml.jackson.databind.JsonNode; import com.github.fge.jackson.JsonLoader; import com.github.fge.jsonschema.core.report.ProcessingMessage; import com.github.fge.jsonschema.core.report.ProcessingReport; import com.github.fge.jsonschema.main.JsonSchemaFactory; import lombok.extern.slf4j.Slf4j; import org.junit.Test;

import java.io.IOException; import java.util.Iterator;

/**

  • @Author: sunshaokang
  • @Date: 2019/3/27 10:44 */

@Slf4j public class JsonValidateUtil { private final static JsonSchemaFactory factory = JsonSchemaFactory.byDefault();

/**
 * 校检JSON
 *
 * @param schema   json方式数据信息(能够了解为校检模版)
 * @param instance 必须认证Json数据信息
 * @return
 */
public static ProcessingReport validatorJsonSchema(String schema, String instance) throws IOException {
    ProcessingReport processingReport = null;

    JsonNode jsonSchema = JsonLoader.fromString(schema);
    JsonNode jsonData = JsonLoader.fromString(instance);
    processingReport = factory.byDefault().getValidator().validateUnchecked(jsonSchema, jsonData);
    boolean success = processingReport.isSuccess();
    if (!success){
        Iterator iterator = processingReport.iterator();
        while (iterator.hasNext()){
            log.error(String.valueOf(iterator.next()));
        }
    }
    return processingReport;
}

}`

  1. 加上Json文档/src/main/resources/json文件目录下加上json文档

    https://upload-images.jianshu.io/upload_images/10291048-5f4ebefef6b023f5.png?imageMogr2/auto-orient/strip|imageView2/2/w/812/format/webp

    image.png

  2. 撰写检测类认证留意:ReadJsonFile.readJsonFileAsString(filePath)此方式中filePath为文档相对性于resources文件目录的途径,以/开始。

@Test public void testschema() throws Exception { String data = ReadJsonFile.readJsonFileAsString("/json/testString.json"); String schema = ReadJsonFile.readJsonFileAsString("/json/testSchema.json"); ProcessingReport processingReport = validatorJsonSchema(schema, data); boolean success = processingReport.isSuccess(); System.out.println(success); // 以下方式能够用于接口自动化 // Assert.assertTrue(report.isSuccess()); }

  1. 对于response校检出参校检

response.then().assertThat().body(matchesJsonSchemaInClasspath("/json/flightChangeResponse.json"));

bak

matchesJsonSchemaInClasspath 是以 io.restassured.module.jsv.JsonSchemaValidator 这一类中静态数据导进的,而且强烈推荐静态数据导进这一类中的全部方式 该方式中立即写json文件夹名称就可以

在其中ProcessingReport目标中维护保养了一迭代器,假如实行不成功(实行取得成功时沒有信息内容),其出示了一些高級常见故障信息内容。每一个不正确很有可能包括下列特性:

  • level: 不正确等级(应当便是error)
  • schema:造成常见故障的方式的地理位置的 URI
  • instance:不正确目标
  • domain:认证域
  • keyword:造成不正确的管束key
  • found:如今种类
  • expected:期待种类
评论
  • 消灭零回复