一、JSON数据类型介绍
1.什么是JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,采用完全独立于语言的文本格式来存储和表示数据。
特点:简洁、易读、易解析
JSON的语法非常简洁明了,易于理解和编写。它支持多种数据类型,可以灵活地表示复杂的数据结构,且由于JSON独立于语言和平台,可以被多种编程语言支持和解析,使得不同平台之间的数据交换变得更加方便。
JSON成为了现代数据交换和存储的常用格式
2.JSON分类
JSON支持的数据类型可以分为简单数据类型和复杂数据类型两种
简单数据类型包括:
string(字符串):由零个或多个Unicode字符组成。在JSON中,字符串必须用双引号括起来。
number(数字):可以是整数或浮点数,JSON中不区分它们。JSON中的数字使用IEEE-754双精度浮点格式表示,不支持八进制和十六进制表示,但可以使用e或E来表示10的指数。
boolean(布尔值):只有两种状态,true和false。
null(空):表示一个空值或不存在的值。
复杂数据类型包括:
Array(数组):是有序的值的集合,使用方括号[]括起来,数组中的值可以是任何JSON数据类型,包括另一个数组或对象。数组中的值用逗号分隔。
Object(对象):是无序的键值对集合,使用花括号{}括起来。在对象中,键(key)必须是字符串,且用双引号括起来,值(value)可以是任何JSON数据类型,包括另一个对象或数组。键和值之间用冒号分隔,键值对之间用逗号分隔。
JSON的字符串中也支持一些转义字符
转义字符 | 说明 |
---|---|
\\ | 反斜线本身 |
\/ | 正斜线 |
\" | 双引号 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\uXXXX | 四位的十六进制数字,表示一个Unicode字符 |
3.作用
在实际应用中,JSON常用于前后端数据交换、配置文件存储、网络数据传输等场景。例如,在Web开发中,服务器经常返回JSON格式的数据给前端,前端解析这些数据后展示给用户。
4.语法
JSON可以表示三种类型:
- 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。
- 对象:表示一组无序的键值对。键值对中的值可以是简单值,也可以是复杂数据类型。
- 数值:表示一组有序的值的列表,数组的值可以是任意类型。
JSON不支持变量、函数或对象实例,是一种表示结构化数据的格式。
简单值
JSON数据形式:
5 // 数值
"Hello JavaScript" // 字符串
null
对象
与JavaScript不同,JSON中的对象要求给属性加上引号:
{
"name": "Karry";
"age": 24
}
// 属性的值也可以是复杂类型
{
"school": {
"name": "hafo",
"location": "Harbin"
}
}
数组
JSON表示数组:
[24, "Karry", true]
JSON数组没有变量和分号。
把数组和对象结合,可以构造复杂的数据集合:
[
{
"title":"JSON数据类型",
"authors":[
"John"
],
edition: 2
},
{
"title":"JavaScript",
"authors":[
"Amy"
],
edition: 3
},
{
"title":"CSS",
"authors":[
"Karry"
],
edition: 4
}
]
解析与序列化
JSON对象有两个方法:
stringfy():把JavaScript对象序列化为JSON字符串
parse():把JSON字符串解析为原生JavaScript值
var book = {
"title":"JavaScript",
"authors":[
"zhang"
],
edition: 2
};
var jsonText = JSON.stringify(book);
alert(jsonText); // {"title":"JavaScript","authors":["zhang"],"edition":2}
默认情况下,JSON.stringify()不包含任何字符或缩进。
将JSON字符串直接传递个JSON.parse()可以得到相应的JavaScript值
var newBook = JSON.parse(jsonText);
book与newBook具有相同的属性,但是彼此是相互独立的。
序列化选项
JSON.stringify()还可以接收两个参数:
- 第一个参数:过滤器,一个数组或一个函数。
- 第二个参数:一个选项,表示是否在JSON字符串中保留缩进
过滤结果
如果参数是数组,JSON.stringify()的结果只包含数组中列出的属性。
var book = {
"title":"JavaScript",
"authors":[
"zhang"
],
edition: 2
};
var jsonText = JSON.stringify(book, ["title", "authors"]);
console.log(jsonText); // {"title":"JavaScript","authors":["zhang"]}
如果参数是函数,传入的函数接收两个参数,属性名和属性值,根据属性名可以知道如何处理属性。属性名是字符串,属性值并非键值对的值,键名可以是空字符串。
返回的值是相应键的值,如果函数返回undefined,那么该属性就会被忽略。
字符串缩进
JSON.stringify()的第三个参数用于控制结果中的缩进和空白符。如果是数值,表示每格缩进的空格数。
如果是字符串,这个字符串将用作JSON字符串的缩进符,缩进字符串最多只能包含10个字符。
toJSON()方法
JSON.stringify()并不能满足所有对象进行序列化的需求。可以给对象定义toJSON()方法,返回其自身的JSON数据格式。
解析选项
JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。如果返回undefined,表示从结果中删除相应的键,如果返回其他值,则将该值插入到结果中。
var book = {
"title":"Java programming",
"authors":[
"zhang",
],
edition: 2,
year: 2024,
releaseDate: new Date(2024, 4,26)
};
var jsonText = JSON.stringify(book);
var newBook = JSON.parse(jsonText, function (key, value) {
if (key == "releaseDate") {
return new Date(value);
} else {
return value;
}
});
console.log(newBook.releaseDate.getFullYear()); // 2024
上面新增了releaseDate属性,该属性保存着一个Date对象。经过序列化后,变成了一个有效的JSON字符串,然后又在newBook中还原成一个Date对象。
二、网络请求介绍
1.网络请求的分类
网络请求主要有八种
请求方式 | 描述 |
---|---|
GET | 发送请求来获得服务器上的资源【比如请求百度的页面】 |
POST | 向服务器提交资源让服务器处理【比如百度云盘上传资源】 |
HEAD | 主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更 |
PUT | 向指定资源位置上上传其最新内容 |
DELETE | 请求服务器删除某资源 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
最常用的是GET和POST请求。
(1)GET请求:一般情况下,发送请求从服务器上获取资源,不会对服务器资源产生任何影响的时候使用GET请求。
(2)POST请求:向服务器发送数据(登录)、上传文件等让服务器处理,会对服务器资源产生影响的时候使用POST请求。
2.请求头常见参数
(1)User-Agent
指浏览器的名称。我们在向别人的服务器发送请求的时候,别人的服务器通过这个参数知道请求是从哪种浏览器发出的,这样就能返回正确的信息。但是如果不设置这个参数的话,我们如果使用Python发送去了请求,别人的服务器【大部分服务器】就知道这个请求时Python发出的,从而不给我们返回正确的数据。因此我们必须设定这个参数。
(2)Referer
表明这个网页是从哪个网站跳转过来的。有些网页只能从特定的链接跳转过来,如果不设置这个参数,有些网页就知道你是通过非浏览器方式试图获取他们的html页面,因此就不返回给你正确的数据。所以这个参数可以用来进行反爬虫设计,我们需要设定这个参数。
(3)Cookie
HTTP协议是无状态的。也就是同一个人在浏览器上发送了两次请求,服务器不知道这两个请求是否来自同一个人。因此这时候就用Cookie来做标识。一般登陆后才能访问的网页,这个时候就需要发送Cookie信息。
3.常见响应状态码
状态码 | 含义 |
---|---|
200 | 请求成功 |
301 | 永久重定向,资源(网页等)被永久转移到其它URL |
404 | 请求的资源(网页等)不存在 |
500 | 内部服务器错误 |