JSON是一种轻量的数据交换格式,用来实现不同平台之间传递数据。
JSON(JavaScript Object Notation ,基于js对象字面表示法 )
js对象表示法
JSON独立于编程语言。
- literal(字面量)是对数据值的具体表示。
例:使用JSON描述我现在穿的鞋子
{
"brand": "NB",
"color":"gray"
"size" :"38"
"hasLaces" :"false"
}
键-值对形式表示,如果被系统对为对象装入内存的话,就变成了“属性”。
-
语法
当值是字符串时必须使用双引号。
多个名值对用逗号分隔。 -
语法验证
可能你的IDE(集成开发环境)会有内置JSON的验证。
这里提供了一些验证工具:
JSONLint(http://jsonlint.com/)
JSON formatter& Validator -
JSON文件(.json)
-
JSON的媒体类型
JSON的MIEM类型是 applicietion/json
-JSON的数据类型
例:让我们来枚举你的优良品德,数组形式表示。
[
"witty",
"charming",
"brave",
"bold"
]
例:对象数据类型,上文已经描述过我的鞋子了,目前还没有新鞋子就不列举了。
-JSON的数据类型
对象
字符串
数组
布尔型
数字
null
- JSON对象的数据类型
例:嵌套对象
{
"person":{
"name":"chaege",
"height":"162",
"head":{
"hair":{
"color":"black",
"lenght":"little",
"style":"line"
},
"eyes":"no"
}
}
}
- JSON中的字符串类型
如果你在字符串值中还想使用双引号,请使用转义字符\进行转义。
例:转义“”
{
"promo":"Say\"Bob's the best!\" at the checkout for free 80z bag of kibble."
}
\会告诉解析器这个双引号并不意味这字符串的结束,一旦解析器将字符串装入内存,每一个双引号的前的反斜杠都会被移除,文本也会按预期输出。
例:转义\
{
"location":"C:\\PRogram Files"
}
反斜杠需要另一个反斜杠来转义。
其他需要转义的字符:
/ 正斜线
\b 退格
\f 换页
\t 制表
\n 换行
\r 回车
\u 后面跟十六进制字符
- JSON中的数字类型
{
"earthMass":5.07219e+24",//地球质量
"weight":"102",
"seattleLatitude":"47,787878", //西雅图经纬度
"seattleLongtitue":"-122.989898"
}
JSON中的数字类型可以是整数,小数,负数或指数。
- JSON中的布尔类型
例:true or false 仅用小写形式表示
{
"toastWithBreakfast":false,
"breadWithLunch":true
}
-
JSON中的null类型
-null用来表示0,一无所有,不存在的意思,表示一个没有值的值。
要和js中的undefind区分开,undefined是在尝试获取一些不存在的对象或变量时返回的结果,也不是json的数据类型。 -
JSON中的数组类型
-数组中所有的值应该具有相同的数据类型。
对象和数组的区别: 对象是名-值对构成的列表或组合,数组是值构成的列表或组合。
例:装着一打鸡蛋的容器,有12个位置来放鸡蛋。
{
"eggCarton:"[
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg"
]
}
假如现在拿出两个鸡蛋来做煎蛋:
{
"eggCarton:"[
"egg",
"null",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"egg",
"null",
"egg"
]
}
例:使用对象构成的数组来表示一场考试的问题和答案。
{
"test":[
{
"question":"The sky is blue",
"answer":true
},
{
"question":"The earth is flat",
"answer":false
},
{
"question":"A cat is a dog",
"answer":false
}
]
}
例:用数组表示两场不同考试的答案
{
"test":[
[
true,
false,
true,
],
[
false,
false,
false
]
]
}
跨站请求伪造(CSRF)读作sea-surf
- GET和POST是http提供的用户服务器交换数据的两种方法。
- GET用于请求数据,得到响应。
- POST用于提交数据,得到响应。
如果服务器端允许GET请求,就可以直接通过浏览器或
-跨站脚本攻击(XSS)
使用JSON时常见的安全漏洞通常发生在js从服务器获取到一段JSON字符串并将其转化为js对象时。
如果想要对代表对象的文本进行操作,首先要将他转换为对象并且装入内存中。
- 在js中使用**eval()**函数来将对象放入内存当中。
- 例:获取对象的属性
var jsonString='{"animals":"cat"}';
var myObject=eval("("+jsonString+")");
alert(myObject.animals);
但是eval()函数的问题是,它会将传入的字符无差别地编译执行,如果从第三方服务器中获取的JSON数据被替换成为恶意代码,那么我们的站点就会无辜蒙冤在访问者的浏览器中编译执行的代码。
**JSON.parse()**便应运而生,该函数仅会解析JSON,不会的执行脚本。
例:使用JSON.parse()代替eval(),前者更加安全。
var jsonString='{"animals":"cat"}';
var myObject=JSON.parse(jsonString);
alert(myObject.animals);
JavaScript中的XMLHttpRequest负责在客户端发起请求,
而Web API负责在服务端返回请求。
例:OpenWeatherMap Web API所提供的JSON格式的天气数据
{
"dt":1433383200,
"temp":{
"day":293.5,
"min":293.5,
"max":293.5,
"night":293.5,
"eve":293.5,
"morn":293.5
},
"pressure":1015.06,
"humidity":98,
"weather":[
{
"id":802,
"main":"Clouds",
"description":"scattered cloud",
"icon":"03n"
}
],
"speed":2.86,
"deg":134,
"clouds":44
}
JSON资源可以通过一个URL来请求:
http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json
尽管许多Wed API 向上图一样只具有读的能力,但是有些如PayAPI这样的还具有交互性。(创建,读取,更新,删除等操作),且都会有详细的操作说明。
例:根据PayPal API的说明,向如下URL发送JSON数据的方式,创建一个新发票。
https://api.sandbox.paupal.com/v1/invoicing/invoices
随后把代表一张发票的JSON数据作为请求发送给Paypal API。
有了PayPal一旦发票被创建,就可以请求(读取)更新以及删除该发票了。
js在幕后进行的这些操作,如请求天气数据称为异步操作。(通常指那些发生在幕后的,不会中断进程的操作)
在js的异步操作中,“主进程”指Web浏览器的显示进程。
这里提到的js中异步操作为AJAX(Asynchronous JavaScript and XML)
- 用AJAX和js中的HTMLHttpResqutst实现AJAX
- 例:js中的HTMLHttp对象
var myXmlHttpRequest=new XMLHttplReauest();
js具有属性(名称-值对),驼峰模式命名。
XMLHttpRequest中的常用函数:
- open(method,url,async(select),useer(s),password())
- send()
- 以下属性:
- onreadstatechange 在代码中给他赋值为一个整数(一个函数)
- readyState 返回一个0-4旳值,用来表示状态码
- status 返回http状态码
- reponseText 当请求成功时,该属性会包含作为文本的响应体(如JSON)
属性的值可以是一个函数,在js中函数也是一种对象。
例:一个新的XMLHttpRequest对象
var myXMLHttpRequest=new XMLHttpRequest();
var url="";
myXmlHttpRequest.onreadystatechange=function(){
if (myXMLHttpRequest.readyState==4&&myXMLHttpResponseText.status==200)
# 反序列化 JSON-->OBJ
var myObject=JSON.parse)myXMLHttpRequest.responseText);
#序列化
var myJSON=JSON.stringify(myObject);
}
}
# 建立一个JSON请求并发送
myXMLHttpRequest.open("GET",url,true);
myXMLHttpRequest.send();
创建了一个保留着JSON资源的字符串,然后将一个函数赋值给myXMLHttpRequest的onreadystatechange属性,该函数会在每次readyState属性发生变化时执行。如果满足if中的条件,就将JSON文本解析成JSON对象。
- 序列化:将对象–>文本
- 反序列化:将文本转化为对象
-onreadystatechange属性的函数值是一个时间处理函数。
底层的JAVA引擎会在每次就绪状态(ready state)改变是获取该函数并调用,就绪状态0到4:
0 未发送, open()函数还没有执行
1 已发送,open()已执行,send()还没执行
2 接收到头部,Send()银镜执行且头部和状态码可以获取了
3 解析中,头部已经收到,且响应体正在解析中
4 完成,请求完成。
服务端的JSON
当谈及web客户端和服务端关系时,我们可以按照技分类。
客户端:HTML CSS JavaScript
服务端:PHP ,ASP.NET ,Node.js,java etc
在web服务端,通过http发送资源请求,服务端会响应一份文档,如HTML或JSON。当文档时JSON时,必须要用服务器代码生成他。同时,服务端必须要先接受一个JSON文档,再返回一个JSON文档。
当通过服务器端技术来请求JSON时,扮演的是客户端的角色。
ASP.NET是由微软开发的服务端Web框架。
支持:ASP.NET MVC,ASP.NET Web API.
使用公共语言运行库(CLR),允许开发人员使用任何受CLR支持的语言来编写代码。(C#,F#,.NET)
但是若要解析JSON,要是用第三方库ASP.NET库,实现该功能最流行的是Json.NET库。
PHP是一种用于创建动态Web页面的服务器脚本语言,其代码可以直接嵌入HTML文档中。
PHP支持对象数据类型,表示一只猫的一个PHP类
class Cat
{
public $name;
public $breed;
public $age;
public $declawed;
}
将类实例化并设置属性,这意味着对象被创建了。
<?php
$cat=new Cat();
$cat->name="Bob";
$cat->breed="Maine Coon";
$cat->age=12;
$cat->declawed=flase;
echo $cat->name
$json=json_encode($cat);
?>
php对json的序列化和反序列化成为JSON的解码与编码(不可读形式)
序列化时调用json_encode
反序列化时调用json_decode函数
请求JSON使用 file_get_contents
反序列化时,loadFromJSON函数接受一个JSON字符串作为参数,会调用内置的json_decode函数反序列化一个一般的PHP对象,然后在foreach循环中遍历该对象的属性。
calss Account{
public $firstName;
public $lastName;
public $phone;
public $gender;
public $address;
public $famous;
public function loadFromJSON($json)
{
$object = json_decode($json);
foreach($object AS $name =>$value)
{
$this->{$name}=$value;
}
}
}
$json =json_encode($acount);
$deserializedAccount= new Account();
$deserializedAccount->loadFromJson($json);
echo $$deserializedAccount->firstName. "".$$deserializedAccount->lastName;
请求JSON调用内置file_get_contnents()函数请求JSON资源。然后创建一个新的Account对象,并且调用loadFromJSON进行反序列化操作。
$url=" ";
$json=file_get_contnents($url);
$deserializedAccount=new Account();
$deserializedAccount->loadFromJSON($json);
echo $deserializedAccount->firstName."".$deserializedAccount->lastName;
Ruby on Rails是一个服务端Web框架。
Node.js是服务端的JavaScript(脱离了浏览器),基于谷歌的开源js引擎V8,有了node.js,就可以使用js编写服务端应用。
Java面向对象的编程语言,可以以java小应用的形式运行在web浏览器中,也可以通过JAVA运行环境(JRE)单独在机器上运行。通过Apache Common IO or JSON on java库提供对JSON的支持。
np现实中一个使用JSON作为配置文件的极佳例子就是Node.js默认的JavaScript包管理器:npm。
CSV文件:以逗号分隔值为载体。
关系型数据库:是使用表格,行和列来以结构化形式存储数据的。
一般会有一个键来给两个表之间建立一种联系。
使用结构化查询语言来(SOL)操作查询数据库。
虽然数据在数据库中是结构化的,但是进行查询后,他们在行和列中就是扁平化的。
NoSOL是键值对存储,将数据简化为键值对,是使用文档储存的,基于文档的概念组织数据的使用与简单的数据关系。
CouchDB是一种使用JSON文档存储数据的NoSQL(文档存储数据库)有了它,数据就不需要因为他们之间的关系而被分来存储,也不需要在存储时进行重组,其关系会在数据中保存,并且在数据出入数据库时其结构也是完好的,既高效又方便。,也利于数据的变化。