必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

在早期的淘宝 TMS,JSON也正成为一种被推荐的数据

2019-11-08 22:32 来源:未知

JSON Schema 那些事儿:基本概念

2016/01/27 · HTML5 · JSON

原文出处: 淘宝前端团队(FED)- 邦彦   

图片 1

1. JSON Schema关键字简介

上篇文章中,我们通过一个简单的JSON Schema的例子,简要地介绍了JSON Schema中经常用到的关键字,并介绍了一些在线辅助工具。一般来说,掌握了这些知识点就可以应对比较常见的需求场景了,但是,如果你需要更多的定制化要求以及更加深入的细节校验的话,那么,我们就需要进一步了解更多关键字的用法和使用场景。

本文相关代码,请看这里

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

来自:

引子

在早期的淘宝 TMS 页面搭建系统中,为了解决页面模板和数据的分离问题,机智的先知们扩充了一系列灵活的 PHP 标签函数,得以将数据的定义从模板视图中解耦出来。以其中一个最为常用的函数为例:

JavaScript

_tms_custom('{"name":"TextLinks","title":"文字链接","group":"文字链接","row":"10","defaultRow":"5","fields":"text:文字:string,href:链接地址(URL):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是在2001年,由Douglas Crockford创建的,并且被IETF(Internet Engineering Task Force)定义为RFC 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": "链接地址(URL)" } } }

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进行网络传输以及进行解析处理的速度更快,效率更高。

HTML header结构
 
 <html>
     <head>
          <!-- 
             base标签为页面上的所有链接规定默认地址或默认目标。
             通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来构造新的相对 URL 。
             使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用<base>指定的基本 URL 
             来作为相对 URL。这其中包括 <a>、<img>、<link>、<form> 标签中的 URL。
              
             在 HTML 中,<base> 标签没有结束标签;在 XHTML 中,<base> 标签必须被正确地关闭。
             <base> 标签必须位于 head 元素内部。
              
             target可选的属性
             _blank
             _parent
             _self
             _top
             framename
             例如将target设置为_blank将使得页面中所有的连接将在新窗口中打开。
          -->
         <base href="" />
         <base target="_blank" />
   
         <!--
           meta标签的属性定义了与文档相关联的名称/值对。
           当属性为http-equiv时,值可以为content-type,expires,refresh,set-cookie等,content 属性关联到 HTTP 头部。
           当属性为name时,值可以为author,description,keywords,generator,revised,others等,content 属性关联到一个名称。
         -->  
         <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
         <!--
           charset设置网页的文件编码,不一定是utf-8,也可能是gb2312,gbk等,根据实际情况修改。
           content-type,可以为mime/subtype,常见为text/html,image/jpg等。
         -->        
         <meta http-equiv="expires" content="2005/05/05 18:00:00">
         <!--脱机浏览的过期时间-->
         <meta http-equiv="pragma" content="no-cache">
         <!--禁止网页从缓存中读取-->
         <meta http-equiv="Refresh" content="5;;
         <!--网页重新定向-->
         <meta http-equiv="set-cookie" content="2005/05/05 18:00:00">
         <!--设置网页的cookie过期时间-->
         <meta http-equiv="Window-target" content="_top">
         <!--设置网页中链接的目标窗口-->
         <meta http-equiv="Page-Enter" content="revealTrans(duration=1000000,transition=50000000)">
         <!--设置网页的打开效果-->
         <meta http-equiv="Page-Exit" content="revealTrans(duration=1000000,transition=50000000)">
         <!--设置网页的关闭效果-->
         
         <meta name="keywords" content="overmind,zerg,protoss">
         <!--设置网页的关键字,搜索的时候优先!!!重要!!! 该数据被搜索引擎编入索引-->
         <meta name="description" content="哈哈哈哈哈">
         <!--插入描述 搜索时被搜索引擎编入索引-->
         
         <title>无标题文档</title>
         <!-- <title> 标签是 <head> 标签中唯一要求包含的东西。 -->
         
         <link rel="stylesheet" type="text/css" href="/html/csstest1.css" >
         <!-- 
             在 HTML 中,<link> 标签没有结束标签。
             在 XHTML 中,<link> 标签必须被正确地关闭。
             <link> 标签定义文档与外部资源的关系。
             <link> 标签最常见的用途是链接样式表
             link 元素是空元素,它仅包含属性。
             此元素只能存在于 head 部分,不过它可出现任何次数。
             标准属性
             id, class, title, style, dir, lang, xml:lang
          -->
         <style type="text/css">
             h1 {color:red}
             p {color:blue}
         </style>
         <!-- 
             <style> 标签用于为 HTML 文档定义样式信息。
             在 style 中,您可以规定在浏览器中如何呈现 HTML 文档。
             type 属性是必需的,定义 style 元素的内容。唯一可能的值是 "text/css"。
             style 元素位于 head 部分中。
              
             所有主流浏览器都支持 <style> 标签。
          -->
           
          <script type="text/javascript" src="myscripts.js"></script>
          <script type="text/javascript">
             document.write("Hello World!")
          </script>
          <!-- 
              <script> 标签用于定义客户端脚本,比如 JavaScript。
              script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件。
              必需的 type 属性规定脚本的 MIME 类型。
              JavaScript 的常见应用时图像操作、表单验证以及动态内容更新。
               
              假如此元素内部的代码没有位于某个函数中,那么这些代码会在页面被加载时被立即执行。<frameset> 标签之后的脚本会被忽略。
              请参阅 noscript 元素;对于那些在浏览器中禁用脚本或者其浏览器不支持客户端脚本的用户来说,该元素非常有用。
           -->   
            
           <noscript>Your browser does not support JavaScript!</noscript>
           <!-- 
             noscript 元素用来定义在脚本未被执行时的替代内容(文本)。
             此标签可被用于可识别 <script> 标签但无法支持其中的脚本的浏览器。
             注释:如果浏览器支持脚本,那么它不会显示出 noscript 元素中的文本。
             注释:无法识别 <script> 标签的浏览器会把标签的内容显示到页面上。为了避免浏览器这样做,您应当在注释标签中隐藏脚本。老式的(无法识别 <script> 标签的)浏览器会忽略注释,这样就不会把标签的内容写到页面上,而新式的浏览器则懂得执行这些脚本,即使它们被包围在注释标签中!
            -->
            
     </head>
     <body>
         aaa
     </body>
 </html>  

2. 用于构建人机可读的文档

计算机领域有个概念叫做自描述。所谓自描述,可以理解为:文档本身包含了自身与其他文档交互相关的描述信息,不需要其他的配置文件或者额外信息来描述。

而 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"是用一对双引号括起来的一个字符串。而它的值"John"在这个例子中也是一个字符串,当然它还可以是其他类型,具体可参考后面数据类型的章节。在市面上很多的产品或技术声称他们使用的是JSON数据格式,但他们在定义属性时,并没有用双引号将属性名称括起来,其实这是违反JSON定义标准的。

完! 

TAG标签:
版权声明:本文由必威发布于必威-前端,转载请注明出处:在早期的淘宝 TMS,JSON也正成为一种被推荐的数据