宏观上看,它是一种轻量的数据格式,在各种地方传递数据。
微观上看,JSON里的数据是被保存在花括号({}
)中的。
从用途上看,JSON是一种数据交换格式。(像XML
这种也是一种数据交换格式)。
JSON是独立于编程语言
的一种能被多种系统用于交换数据的的数据交换格式。然后通过各种系统的解析器将JSON文本转换为系统可以读取的形式。
JSON是一种基于JavaScript对象表示法
的数据交换格式。
表示法
:一个用于表示诸如数字或单词等数据的字符系统。
可移植性
:以一种对双方系统都兼容的方式在平台间传递信息。
JSON基于JavaScript对象字面量
字面量(literal)
:所谓字面量,是对数据值的具体表示。
例如:x = 5
,5
是字面量,x
是变量。
JSON是基于Javascript对象字面量的,所以他们看起来很像。
这是合法的JSON
{
"title":"This is my title",
"body":"This is my body"
}
这是不合法的JSON,这是一种JavaScript对象
{
'title':"This is my title",
'body':"This is my body"
}
正确的JSON语法
JSON中的键
始终需要被双引号包裹。
下面两种格式虽然也可以,但是最好不要这么做。因为JSON中的键值对是一种对许多系统都十分友好的数据结构,而使用空格和特殊字符(即a-z、0-9除外的其他字符)忽略了可移植性
,如果我们这么做的话会直接降低JSON数据的可移植性;因此为了获得最大可移植性
,应尽可能避免使用空格或特殊字符。
1."My animal" : "cat"
2."Lindsay's animal" : "cat"
所以如果想用多个单词,一般这样写:
"lindsaysAnimal" : "cat"
这里面的值
不是必须被双引号包裹的,当值
是字符串时,必须使用双引号包裹,但是还有数字
,布尔值
,数组
,对象,NULL
等这些不应该被双引号包裹。
JSON在线验证工具
验证示例:
JSON的媒体类型
媒体类型也有其他称呼:比如:“互联网媒体类型”,“内容类型”,“MIME类型”
。
它使用“类型/子类型”
这种格式来表示。比如"text/html"
。
JSON的媒体类型是"application/json"
。
JSON中的数据类型
-
JSON的
字符串
类型:- 一个字符串值,如"my string",使用双引号包裹。
-
JSON的
布尔
类型:- true或false
-
JSON的
数字
类型:- 一个数字值,如
42
,可以使正整数、负整数、小数或指数。
- 一个数字值,如
-
JSON的
null
类型:- 一个表示空值的
null
值。
- 一个表示空值的
-
JSON的数组类型:
- 数组是值的集合或列表,每个值都可以是字符串,数字,布尔值,对象或数组中的任何一种,数组必须被方括号
[]
包裹,且值与值之间用逗号隔开。
- 数组是值的集合或列表,每个值都可以是字符串,数字,布尔值,对象或数组中的任何一种,数组必须被方括号
-
JSON的对象类型:
- 对象类型是使用逗号分隔的名称-值对构成的集合,并使用花括号
{}
包裹。
- 对象类型是使用逗号分隔的名称-值对构成的集合,并使用花括号
对象和数组很关键的一个区别就是,对象是名称-值对构成的列表或集合,数组是值构成的列表或集合。
对象和数组另一个关键的区别是,数组中所由的值应具有相同的数据类型。
JSON Schema
本身也是一种JSON字符串。是一种模式,一种约束。必须按这个Schema写。Schema的例子如下:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Product",
"description": "A product from Acme's catalog",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a product",
"type": "integer"
},
"name": {
"description": "Name of the product",
"type": "string"
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
},
"required": ["id", "name", "price"]
}
参数说明:
$schema
:$schema关键字状态,表示这个模式与v4规范草案书写一直。
title
:实体名称。
description
:用来描述实体。
type
:实体类型。
properties
:定义实体属性。
required
:实体必须的属性。
JSON中的安全问题
JSON.parse()
:只编译不执行,代替eva()
:先编译后执行。
安全漏洞:决策上的失误
不那么规矩的JSON:
{
"message":"<div \"alert('gotcha')\">hover here.</div>"
}
当它在页面的消息页面输出时,就会造成威胁。黑客可以通过该脚本获取你在这一页面上的所有私人信息,并发送到它自己的网站并保存。
可以键消息中的所有HTML字符进行转码,这样的话,诸如<div>
这样的标签就会被转换成<div>,然后插入页面(<div>不是合法的HTML)。
不想写了。。。。