0%

JSON必知必会

JSON

[TOC]

什么是JSON

  • JSON是一种数据交换格式

  • JSON独立于编程语言

  • JSON全称是JavaScript Object Notation(JavaScript对象表示法)

  • JSON源于JavasSript的一个子集

数据交换格式就是用于在不同的平台或系统间交换数据的文本,而表示法(专业术语)就是一个用于表示诸如数字或者单词等数据的字符系统,而且json具有可移植性,即以一种双方系统都兼容的方式在平台间传递信息

JSON的语法

1
2
3
4
5
6
{
"brand" : "Crocs",
"color": "pink",
"size": 9,
"hasLaces" false
}

首先json是基于JavaScript对象字面量,而字面量就是对数据值的具体表示(指字面意思与其想要表达的意思是完全一致的值),为什么是基于呢,因为对象里还可以包含函数,所以不仅可以创建对象来表示一个物体的属性,还可以创建函数来表示物体的行为,但是数据交换格式的核心是数据,所以json中并不会涉及到JavaScript对象字面量中的函数,json所基于的JavaScript对象字面量单纯是指对象字面量及其属性的语法表示,而这种属性的表示方法是通过名称-值对来实现的

  • JSON并不是JavaScript对象字面量而是基于JavaScript对象字面量
  • JSON基于JavasScript对象子面量中属性的语法,但是并不包含于JavaScript对象字面量中函数相关的部分,也就是说JSON的属性的值不能是函数
  • JSON属性都必须使用双引号,单引号也不行 (当值是字符串类型时也只能使用双引号),而在js中属性可以使用单引号代替双引号,且属性不需要加引号
  • JSON中属性的值可以是字符串 数字 布尔值 null 数组或是对象 ,json的值并不是总是需要被双引号包裹,当值为字符串时,必须使用双引号,而其他数据类型的值都不应该被双引号包裹
  • JSON中的数字可以是整数、小数、指数、或负数
  • JSON数据类型中没有undefined
  • JSON文件使用.json扩展名

不可以正常使用的代码

1
2
3
{
"promo": "Say "Bob is is best!". to him"
}

可以正常使用的代码

1
2
3
4
5
6
7
//需要使用反斜线对字符串进行转义
{
"promo": "Say \"Bob is is best!\" to him."
}
{
"locations": "C:\\Program Files"
}

不可以通过验证的JSON

1
2
3
4
{
title: "This is my title.",
body: "This is my body."
}

不合法的JSON

1
2
3
4
{
'title': 'This is my title.',
'body': 'This is my body.'
}

合法的JSON

1
2
3
4
{
"title": "This is my title.",
"body": "This is my body."
}

语法验证

JSON Formatter & Validator

JSON Editor Online

媒体类型

媒体类型包括

  • 互联网媒体类型
  • 内容类型
  • “MIME“类型

使用”类型/子类型”来表示 比如常见的text/html

JSON的MIME类型式application/json

对象和数组的区别

对象是键值对构成的列表或集合 数组是值构成的列表或集合

数组中应该具有相同的数据类型

(虽然数组中具有不同的数据是合法的 但是在JSON中并不建议这么做。因为JSON是一种数据交换格式 而而如果将数据传递给一个不使用JavaScript的系统,那么在解析时很可能会出错)

JSON Schema

数据交换的一种虚拟的”合同”

作用 :验证数据是否满足接收方的要求

  • JSON验证器负责验证语法的错误,而JSON Schema负责提供一致性检验
  • JSON Schema是数据接受方的第一道防线 也是数据发送方节约时间 保证数据正确的好工具
  • JSON可以解决下列由有关一致性的问题:
    1. 值的数据类型是否正确
    2. 是否包含所需要的数据
    3. 值的形式是不是我需要的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
//声明一个schema文件,值为草拟版本的链接
"$schema":"http://json-schema.org/draft-04/schema",
//schema文件的标题
"title": "Cat",
//定义需要在json中包含的属性
"properties": {
"name":{
"type": "string"
"minlength": 3,
"maxlength": 20
},"age":{
"type": "number",
"description": "Your cat's age in years.",
"minimum": 0
},
"declawed":{
"type": "boolean"
},
"description":{
"type": "string"
}
},
"required":[
"name",
"age",
"declawed",
]
}

合法的JSON

1
2
3
4
5
{
"name":"jack",
"age":2,
"declawed":false
}

required

含有required字段的Schema 要求required数组中的属性必须出现在JSON中 如果没有required字段的话

那么JSON为空也是合法的

不可以通过验证的JSON

1
2
3
4
5
6
{
"name": "Fluffy the greatest cat in the whole wide world",
"age": -2,
"declawed" false,
"description": "Fluffy loves to sleep all day."
}

JSON的安全问题

跨站请求伪造(CSRF)(cross-site-request forgery)

是一种站点对用户浏览器信任而发起攻击的方式

1
2
3
4
5
6
7
8
[
{
"user":"v"
},{
"password":123456
}
]

上面的JSON虽然是合法的 但是却十分危险 因为它是可以执行的JavaScript脚本(使用script标签链接并使用) 被称为顶层JSON数组


1
2
3
4
5
6
7
8
9
10
{ 
"info":
[
{
"user":"v"
},{
"password":123456
}
]
}

将数组放在对象种 使其成为非法的JavaScript 这样就不会被script标签加载

禁止使用GET请求数据 仅使用POST请求获取数据 这样黑客就无法通过URL或