JSON

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(文档存储数据库)有了它,数据就不需要因为他们之间的关系而被分来存储,也不需要在存储时进行重组,其关系会在数据中保存,并且在数据出入数据库时其结构也是完好的,既高效又方便。,也利于数据的变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值