得以将数据的定义从模板视图中解耦出来,JSON也

JSON Schema 那个事情:基本概念

2016/01/27 · HTML5 · JSON

初藳出处: Tmall前端共青团和少先队(FED)- 邦彦   

图片 1

1. JSON Schema关键字简单介绍

上篇随笔中,大家透过三个简单的JSON Schema的事例,简要地介绍了JSON Schema中平日使用的显要字,并介绍了一部分在线协理理工科程师具。平日的话,精通了那个知识点就能够答应比较分布的供给景况了,不过,如果您要求越来越多的定制化须要甚至愈发浓厚的细节校验的话,那么,大家就须要进一层询问更加的多种要字的用法和动用境况。

正文相关代码,请看这里

转载: http://www.jianshu.com/p/8b428e1d1564#

引子

在最先的Tmall TMS 页面搭建系统中,为了缓和页面模板和数据的分开难点,机智的贤淑们扩张了意气风发星罗棋布灵活的 PHP 标签函数,得以将数据的概念从沙盘模拟经营视图中解耦出来。以个中三个不过常用的函数为例:

JavaScript

_tms_custom('{"name":"TextLinks","title":"文字链接","group":"文字链接","row":"10","defaultRow":"5","田野先生s":"text:文字:string,href:链接地址(UEvoqueL卡塔尔:href"}'卡塔尔(قطر‎;

1
_tms_custom('{"name":"TextLinks","title":"文字链接","group":"文字链接","row":"10","defaultRow":"5","fields":"text:文字:string,href:链接地址(URL):href"}');

当调用 _tms_custom(...) 函数并传到钦赐格式的 JSON 参数,交由翻译引擎处理后,会创设出那样的编写制定表单:

图片 2

而由此编写制定表单录入的数据,最后会在页面中以 PHP 数组的款式填充和占位:

JavaScript

array(5) { [0]=> array(2) { ["text"]=> string(6) "淘宝网" ["href"]=> string(22) "" }, ... }

1
2
3
4
5
6
7
8
9
10
array(5) {
[0]=>
array(2) {
["text"]=>
string(6) "淘宝网"
["href"]=>
string(22) "http://www.taobao.com/"
},
...
}

从标签函数到数量对象的运维流程,能够用一张图轻易予以总结:

图片 3

这种模板和数码分离的法子,在前些年那是一定先进的。它用简易的语法,描述了模版所需的多寡格式,还足以依赖标签署义,间接组织出模拟数据,方便在开垦阶段使用 “标签 + 模拟数据” 的措施调节和测验页面。

汇报数据格式布局模拟数据 的角度,那和大家要谈的 JSON Schema 不期而遇。大家用 JSON 格式来重写多少对象,应该是酱紫的:

JavaScript

[ { "text": "淘宝网", "href": "" }, ... ]

1
2
3
4
5
6
7
[
{
    "text": "淘宝网",
    "href": "http://www.taobao.com/"
},
...
]

假诺用 JSON Schema 语法描述这份数据,可以完全代表标签函数的方案。那也多亏天猫商城 TMS 页面搭建系统在数量这块的衍生和变化进度:即从使用标签函数定义数据的办法,转换为利用 JSON Schema 描述数据。

2. JSON Schema关键字详细明白

例风流洒脱:涉及的基本点字($schema、title、description、type、properties、required)

{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "TestInfo", "description": "some information about test", "type": "object", "properties": { "name": { "description": "Name of the test", "type": "string" } }, "required": [ "name" ]}

该重大字用于钦赐JSON Schema版本新闻,例一中钦命的本子为:draft-04。该重大字是能够省略的,当前最新版本为draft-06。注意:该重大字的值必需使用官方提供的值,无法和谐随意写。

那三个第一字都是用来陈诉对应的JSON成分的,唯生机勃勃的分化在于,title相对来讲,特别简明,而description越发趋向于详细描述相关新闻。当然了,这多少个关键字都以能够省略的。大家来看例一中最外层的title和description是比照校验JSON对象的汇报,而里面,name成分之下的description其实是相对来讲校验JSON对象的一级key的陈述,当然,你也得以对name扩充title新闻。

该重大字用于约束待校验JSON成分所属的数据类型,例一中最外层的type关键字值为object,即意味着待校验JSON数据为一个JSON对象,而name下的type关键字值为string,即表示待校验JSON对象中的顶级key的数据类型为string。那么,依据那一个需求,上面那几个JSON数据是适合必要的。

{ "name": "hello first blog"}

而,上边那一个JSON数据是不适合必要的,因为name的连串为integer也许number,并非string。

{ "name": 520}

JSON Schema 简介

JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.

JSON Schema官网

JSON Schema 是多少个足以对json格式数据进行校验和打开内容陈说的文书档案,它本身也是依照json格式的。
首要有以下职能:

  1. 对现存的json数据格式举办描述(字段类型、内容长度、是不是必需存在、取值示例等);
  2. 是叁个描述清晰、人机可读的文书档案;
  3. 自动测量检验、验证顾客端提交的数据;

JSON概览

JSON(JavaScript Object Notation)是黄金时代种基于文本的数据沟通格式。不论你的行使是用哪类开辟语言编写的(Java/EE,Ruby,PHP,C#/.Net等等),你都足以动用JSON来通过网络举行数量人机联作和处理。大概全体的编制程序语言都有很好的库或第三方工具来提供依附JSON的API支持,因此你可以拾壹分便利地利用别的本身垂怜的编制程序语言来管理JSON数据。而其他方面随着REST、像MongoDB那样的NoSQL技艺或正式的分布应用,JSON也正形成豆蔻年华种被推举的数据人机联作格式。

JSON是在二〇〇二年,由DougRuss Crockford创设的,何况被IETF(Internet Engineering Task Force卡塔尔(قطر‎定义为XC90FC 4627标准,详请参照他事他说加以考查:http://tools.ietf.org/html/rfc4627。JSON的媒体类型被定义为 application/json,而文件的后缀为.json。

什么是 Schema?

当大家在陈说 文字链接 的时候,须要预订数据的集体育赛职业办公室法,举例,必要掌握有怎么着字段,这个字段的取值怎样表示等,这就是JSON Schema 的来自。

我们以 文字链接 为例,它对应的 JSON Schema 大概如此:

JavaScript

{ "type": "object", "properties": { "text": { "type": "string", "title": "文字" }, "href": { "type": "string", "title": "链接地址(UCRUISERL卡塔尔(قطر‎" } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"type": "object",
"properties": {
"text": {
"type": "string",
"title": "文字"
},
"href": {
"type": "string",
"title": "链接地址(URL)"
}
}
}

JSON Schema 概念了如何遵照 JSON 格式描述 JSON 数据构造的行业内部,进而提供数据校验、文书档案生成和接口数据人机联作调节等黄金时代多级手艺。它的特色和用项,能够概略总结为以下几点:

2.3.1 type经常见到取值

那正是说,type又有怎么样取值呢?当type取值为string类型的时候,是不是还能增多任何一些增大限定条件吧?我们接下去会依照type的不等取值一丢丢剖判涉及到的基本点字含义及用法。首先,大家来看一下,type平淡无奇的取值。具体如下:

type取值 对应的Java数据类型
object java.lang.Object
array java.util.List
integer int(java.lang.Integer)
number float(java.lang.Float)或int
null null
boolean java.lang.Boolean
string java.lang.String

在上表中,大家使用了和Java数据类型比较解析的花样提交了type的大范围取值,接下去,大家会深入分析当type为不一致取值时,恐怕涉嫌的入眼字含义和用法。

JSON Schema 轻便示例

大家把要求被证实的json文书档案称为instance,用来校验它的文书档案正是schema;
三个最底子的schema正是贰个空的json对象 {} ,对instance不做其余限定,未有此外描述。上面是贰个简短的instance和schema示例:

供给被校验的instance:

{
  "foo": 32,
  "bar": "Must equal this value"
}

schema:

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "number"
    },
    "bar": {
      "const": "Must equal this value"
    }
  }
}

其间首要字“type”能够用来对instance的项目进行界定,它能够取如下多少个值 object, array, string, number, boolean, null。
根本字“const”供给被证明的数目与其所定义的剧情保持风流罗曼蒂克致。

JSON是什么

JSON是朝气蓬勃种简易多少格式,它有三种数据构造:

  • 键值对 —— Name/Value (Key/Value)
  • 对象 —— Object
  • 数组 —— Arrays

二个管用的JSON文书档案须求被含有在风姿罗曼蒂克对花括号内
{ JSON-Data }

请留意,有个别开垦社区或线上文书档案直接将地方的JSON文档称为JSON字符串,那二者的情致是同等的

1. 用以描述数据结构

在描述 JSON 数据时,要是数量本身的复杂度相当高,高到三个维度四维,普通的价签函数已经江淹才尽表示这种层级构造了,而 JSON Schema 利用 objectarray 字段类型的屡次嵌套,能够规避掉那一个毛病。

本来,除了键值等基本新闻,规范范围还提供了增进的尤为重要词扶持,假如想通过自定义扩张字段,消亡特定情景的政工供给,也是不行有利的。

2.3.2 从type的两样取值聊到

当type取值为object时,涉及的机要字:properties、required、minProperties、maxProperties、propertyNames、dependencies、patternProperties、additionalProperties

  • properties

该重大字的值是一个目的。

用于钦命JSON对象中的各样差别key应该满足的校验逻辑,若是待校验JSON对象中全部值都可以因而该重大字值中定义的应和key的校验逻辑,各种key对应的值,都以一个JSON Schema,则待校验JSON对象通过校验。从此以往处,大家得以看见,只要待校验JSON对象的具备key分别都经过相应的JSON Schema的校验检验,那一个指标才算是通过校验。

其余,必要潜心的是,省略该重大字和该重大字的值为空对象,拥有相似效果。比如:

"properties": { "id": { "description": "The unique identifier for a book", "type": "integer", "minimum": 1 }, "price": { "type": "number", "minimum": 0, "exclusiveMinimum": true } }
  • required

该重大字的值是叁个数组,而数组中的成分必得是字符串,並且必得是唯风流倜傥的。

该重大字节制了JSON对象中必需带有哪些顶尖key。倘诺二个JSON对象中包含required关键字所钦点的有着一级key,则该JSON对象能够透过校验。

除此以外,须要小心的是,省略该重大字和该重大字的值为空数组,具备相像作用。举例:

"required": [ "id", "name", "price" ]
  • minProperties、maxProperties

那多个首要字的值都以非负整数。

钦赐了待校验JSON对象中一级key的个数约束,minProperties内定了待校验JSON对象能够担当的起码一级key的个数,而maxProperties钦赐了待校验JSON对象能够选取的最多拔尖key的个数。

除此以外,需求注意的是,省略minProperties关键字和该重大字的值为0,具有相符功用。而,假诺轻便maxProperties关键字则象征对一流key的最大个数未有节制。比如,如若限定二个JSON对象的一流key的最大个数为5,最小个数为1,则JSON Schema如下:

"minProperties": 1,"maxProperties": 5
  • propertyNames

小心:该重大字,官方表达中扶助,可是,有望你选拔的平台依旧第三方工具不协理啊。所以,使用需审慎。

该重大字的值是四个得力的JSON Schema。

假如待校验JSON对象中的各样一流key都能透过该重大字内定的JSON Schema的校验,那么才以为待校验的JSON对象通过校验。注意,待校验JSON对象的一流key都以string类型。

别的,要求在意的是,省略该重大字和该重大字的值为空JSON Schema,具有同等效果。

  • patternProperties

该重大字的值是叁个JSON对象,该JSON对象的每一个顶级key都以八个正则表明式,value都以三个JSON Schema。

除非待校验JSON对象中的超级key,通过与之协作的patternProperties中的一级正则表达式,对应的JSON Schema的校验,才算通过校验。举例,要是patternProperties对应的值如下:

"patternProperties": { "^a": { "type": "number" }, "^b": { "type": "string" }}

地点的JSON Schema代表,待校验JSON对象中,全部以a起首的一级key的value都必得是number,全体以b伊始的顶级key的value都一定要是string。

  • additionalProperties

该重大字的值是多少个JSON Schema。

设若待校验JSON对象中设有,既未有在properties中被定义,又从不在patternProperties中被定义,那么这几个拔尖key必得经过additionalProperties的校验。

  • dependencies

待定。。。

  • 完全示例:
{ "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" ]}

当type取值为array时,涉及的首要性字:items、additionalItems、minItems、maxItems、uniqueItems、contains

  • items

该重大字的值是多个卓有成效的JSON Schema可能一组有效的JSON Schema。

当该重大字的值是三个使得的JSON Schema时,仅有待校验JSON数组中的全部因素均经过校验,整个数组才算通过校验。比方,假使items关键字的现实性定义如下:

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

地方的JSON Schema的意思是,待校验JSON数组的因素都以string类型,且最小可承担长度是5。那么上面那个JSON数组显明是切合必要的,具体内容如下:

["myhome", "green"]

那正是说上边那一个JSON数据则是不切合必要,因为第三个要素的尺寸小于5,具体内容如下:

["home", "green"]

当该重大字的值是大器晚成组有效的JSON Schema时,唯有待校验JSON数组的持有因素通过items的值中对应地方上的JSON Schema的校验,那么,整个待校验JSON数组才算通过校验。

此间须要在乎的是,假使items定义的平价的JSON Schema的多少和待校验JSON数组瓜时素的多少不黄金年代致,那么将要选择“取小条件”。即,要是items定义了3个JSON Schema,可是待校验JSON数组唯有2个因素,此时,只要待校验JSON数组的前五个要素能够分别通过items中的前三个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"]

["good", 12]
  • 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,具有雷同效果。

设若一个additionalItems的值如下:

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

地方的JSON Schema的情趣是,待校验JSON数组第三个元素是string类型,且可担当的最短长度为5个字符,第一个要素是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": "array", "items": [ { "type": "string", "minLength": 5 }, { "type": "number", "minimum": 10 } ], "additionalItems": { "type": "string", "minLength": 2 }, "minItems": 1, "maxItems": 5, "uniqueItems": true}

当type取值为integer或number时,涉及的主要字:multipleOf、maximum、exclusiveMaximum、minimum、exclusiveMinimum

作者们第一来回看一下integer和number的界别,integer也正是Java中的int类型,而number也正是Java中的int或float类型。

  • 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": "number", "multipleOf": 0.5, "maximum": 12.5, "exclusiveMaximum": true, "minimum": 2.5, "exclusiveMinimum": true}

当type取值为string时,涉及的基本点字:maxLength、minLength、pattern、format

  • maxLength

该重大字的值是三个非负整数。

该重大字规定了待校验JSON成分能够经过校验的最大尺寸,即待校验JSON成分的最大尺寸必须低于也许等于该重大字的值。

其余,供给静心的是,假使省略该重大字则表示对待校验成分的最大尺寸未有约束。

  • minLength

该重大字的值是二个非负整数。

该重大字规定了待校验JSON元素能够通过校验的矮小长度,即待校验JSON成分的蝇头长度必得超过只怕等于该重大字的值。

其余,要求留意的是,就算省略该重大字和该重大字的值为0,具备同等效果。

  • pattern

该重大字的值是多个正则表明式。

只有待校验JSON成分切合该重大字内定的正则表达式,才算通过校验。

  • format

该重大字的值只能是以下取值:

date-time、email、hostname、ipv4、ipv6、uri、uri-reference、uri-template、json-pointer。

假定待校验的JSON元素刚好是贰个邮箱地址,那么,我们就足以应用format关键字张开校验,而不必经过pattern关键字钦赐复杂的正则表明式实行校验。譬喻:

{ "type": "string", "format": "email"}
  • 完整示例:
{ "type": "string", "pattern": "^#([0-9a-fA-F]{6}$", "maxLength": 6, "minLength": 6}

全类型可用,即不囿于于有些type,涉及的首要字:enum、const、allOf、anyOf、oneOf、not、default

  • enum

该重大字的值是二个数组,该数组最少要有叁个因素,且数组内的每一个要素都是唯风流倜傥的。

假如待校验的JSON成分和数组中的某二个成分相通,则通过校验。不然,不可能透过校验。

在乎,该数组中的成分值能够是任何值,包罗null。省略该重大字则意味绝不看待校验成分实行该项校验。举个例子:

{ "type": "number", "enum": [2, 3, null, "hello"]}
  • const

该重大字的值能够是其余值,包蕴null。

假定待校验的JSON成分的值和该重大字钦命的值相仿,则透过校验。不然,不能够通过校验。

省略该重大字则代表不要对待校验成分实行该项校验。

在乎,该重大字部分第三方工具,并不帮衬。

  • allOf

该重大字的值是叁个非空数组,数组里面的各个成分都必需是四个使得的JSON Schema。

除非待校验JSON成分通过数组中具备的JSON Schema校验,才算真正通过校验。

  • anyOf

该重大字的值是二个非空数组,数组里面包车型地铁各样成分都不得不是一个管用的JSON Schema。

只要待校验JSON成分能够通过数组中的任何七个JSON Schema校验,固然通过校验。

  • oneOf

该重大字的值是一个非空数组,数组里面的每一种成分都必需是叁个可行的JSON Schema。

如果待校验JSON成分能且只好通过数组中的某叁个JSON Schema校验,才算真的通过校验。不可能通过别的一个校验和能经过四个及以上的校验,都不算真的通过校验。

  • not

该重大字的值是贰个JSON Schema。

只有待校验JSON成分不可能通过该重大字内定的JSON Schema校验的时候,待校验成分才算通过校验。

  • default

该重大字的值是从未有过任何供给的。

该重大字日常用来钦命待校验JSON成分的暗中同意值,当然,这些默许值最棒是相符须要的,即能够通过相应的JSON Schema的校验。

别的,须求小心的是,该重大字除了提暗示义外,并不会时有爆发任何实质性的影响。

再说type关键字

亟待特别注意的是,type关键字的值能够是三个string,也得以是贰个数组。

如若type的值是一个string,则其值只可以是以下两种:null、boolean、object、array、number、string、integer。

风度翩翩经type的值是一个数组,则数组中的成分都必需是string,且其取值依然被界定为上述三种。只要带校验JSON成分是内部的生机勃勃种,则经过校验。

JSON Schema 在线工具

依据JSON数据和呼应的JSON Schema校验数据:
http://json-schema-validator.herokuapp.com/
https://jsonschemalint.com/

听别人说JSON数据在线生成JSON Schema:
https://jsonschema.net/

干什么选择JSON

JSON被以为是XML的很好代替者。因为JSON的可读性相当好,而且它从未像XML那样带有众多冗余的要素标签,这使得应用在使用JSON举办互连网传输以致开展分析处理的速度越来越快,功用更加高。

2. 用来创设人机可读的文书档案

Computer世界有个概念叫做自描述。所谓自描述,可见为:文书档案本人带有了自家与此外文书档案交互作用相关的描述音信,无需任何的铺排文件或然额外音讯来汇报。

而 JSON Schema 正是自描述的,它本人正是后生可畏份很周密的印证文书档案,字段的意义表达、该如何取值、格式的需求等都清晰明了。

3. JSON Schema相比复杂的演示:

{ "$schema": "http://json-schema.org/draft-04/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" ]}

在意,以上JSON Schema只是为着突显部分器重字的用法,大概和实在使用略有分裂。

官方的参照他事他说加以考查文书档案如下:

JSON Schema第三方工具

JSON Schema已经有多种语言达成的第三方工具得以运用,详见官方网址证实:http://json-schema.org/implementations。下边3个是java的相干兑现:

json-schema-validator supports draft 4 includes draft-04 hype-schema syntax support (LGPLv3)
json-schema (implementation based on the org.json API) supports draft 4, draft 6 (Apache License 2.0)
json-schema-validator supports draft 4 (Apache License 2.0)

键值对 —— Name/Value

键值对是JSON中最基本的数据结构:
{ “firstName”: “John”}

在上头的例证中属性"firstName"是用大器晚成对双引号括起来的贰个字符串。而它的值"约翰"在那些例子中也是贰个字符串,本来它还能够是其他连串,具体可参看前面数据类型的章节。在市情上超级多的制品或技巧声称他们运用的是JSON数据格式,但她们在概念属性时,并未有用双引号将属性名称括起来,其实那是违反JSON定义规范的。

3. 用来转移模拟数据

经过标签函数生成模拟数据,只好消除大旨的格式必要。举例 string 类型的字段,模拟出来的多寡,无非是三个Infiniti定字符串。

但在 JSON Schema 中,由于字段的汇报不止是体系,越来越多的自律原则,能够确定保障模拟数据更近乎于真实数据。

采纳第三方工具json-schema-validator

上边采取上述3个工具中的第3个,完结用schema验证json数据的效能:
1.第风姿洒脱在pom里,增多如下配置:

                <!-- fge -->
        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>2.2.6</version>
        </dependency>
        <!-- fasterxml -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>

2.编辑工具类JsonSchemaValidator.java

public class JsonSchemaValidator {
    public static Map<String, Object> validateJsonByFgeByJsonNode(JsonNode jsonNode, JsonNode schemaNode) {
        Map<String, Object> result = new HashMap<String, Object>();
        ProcessingReport report = null;
        report = JsonSchemaFactory.byDefault().getValidator().validateUnchecked(schemaNode, jsonNode);
        if (report.isSuccess()) {
            // 校验成功
            result.put("message", "校验成功!");
            result.put("success", true);
            return result;
        } else {
            System.out.println("校验失败!");
            Iterator<ProcessingMessage> it = report.iterator();
            String ms = "";
            while (it.hasNext()) {
                ProcessingMessage pm = it.next();
                if (!LogLevel.WARNING.equals(pm.getLogLevel())) {
                    ms += pm;
                }

            }
            result.put("message", "校验失败!" + ms);
            result.put("success", false);
            return result;
        }
    }

    public static JsonNode getJsonNodeFromString(String jsonStr) {
        JsonNode jsonNode = null;
        try {
            jsonNode = JsonLoader.fromString(jsonStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonNode;
    }

    public static JsonNode getJsonNodeFromFile(String filePath) {
        JsonNode jsonNode = null;
        try {
            jsonNode = new JsonNodeReader().fromReader(new FileReader(filePath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonNode;
    }

}

3.收受页面数据、读取文件数量的JsonSchemaController

@RestController
public class JsonSchemaController {

    @Value("${upload.rootPath}")
    private String rootPath;


    @RequestMapping(value = "/json-schema/validate", method = RequestMethod.GET)
    public Map<String, Object> jsonSchemaValidate(String jsonStr) {
        Map<String, Object> result = new HashMap<String, Object>();

        JsonNode jsonNode = JsonSchemaValidator.getJsonNodeFromString(jsonStr);
        if (jsonNode == null) {
            result.put("success", false);
            result.put("message", "json报文格式错误");
            return result;
        }

        String filePath =  rootPath + "/json-file/json_schema_test.json";
        JsonNode schemaNode = JsonSchemaValidator.getJsonNodeFromFile(filePath);
        if (schemaNode == null) {
            result.put("success", false);
            result.put("message", "json Schema文件不存在,无法校验!");
            return result;
        }
        return JsonSchemaValidator.validateJsonByFgeByJsonNode(jsonNode, schemaNode);
    }

}

3.前端页面json_schema.html

<body class=" ">
    <div>
        <textarea class=" " name="parameterContentLeft" id="parameterContentLeft" placeholder="请输入请求报文内容"></textarea>
    </div>
    <br>
    <button onclick="setAjaxRequest();" id="doJson" class=" ">发送</button>
    <div class=" ">
        <pre id="responsePre">

        </pre>
    </div>
    <script src="frame/jquery.min.js"></script>
    <script>
        function setAjaxRequest() {
            $.ajax({
                url : "/json-schema/validate",
                type : "GET",
                data : {
                    jsonStr : $("#parameterContentLeft").val()
                },
                async : false
            }).done(function(data) {
                $("#responsePre").html(data.message);
            });
        }
    </script>
</body>

对象 —— Object

一个JSON对象是包含了风流倜傥组未排序键值对的聚合。上边例子中的address就是多个JSON对象:

{
    “address” : {
        “line1” : “555 Main Street”,
        “city” : “Denver”,
        “stateOrProvince” : “CO”,
        “zipOrPostalCode” : “80202”,
        “country” : “USA”
    }
}

上面的事例中address对象蕴涵了5个属性,它们之间用,实行剪切

本文由必威发布于必威-前端,转载请注明出处:得以将数据的定义从模板视图中解耦出来,JSON也

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。