什么是JSON
JSON是一種基于文本的數據交換方式,或者叫做數據描述格式
JSON的優(yōu)點:
1聋袋、基于純文本队伟,跨平臺傳遞極其簡單穴吹;
2幽勒、Javascript原生支持,后臺語言幾乎全部支持港令;
3啥容、輕量級數據格式,占用字符數量極少,特別適合互聯(lián)網傳遞疲牵;
4疏尿、可讀性較強,雖然比不上XML那么一目了然遥昧,但在合理的依次縮進之后還是很容易識別的覆醇;
5、容易編寫和解析炭臭,當然前提是你要知道數據結構永脓;
JSON的格式/規(guī)則:
JSON能夠以非常簡單的方式來描述數據結構,XML能做的它都能做鞋仍,因此在跨平臺方面兩者完全不分伯仲常摧。
1、JSON只有兩種數據類型描述符威创,大括號{}和方括號[]落午,其余英文冒號:是映射符,英文逗號,是分隔符肚豺,英文雙引號""是定義符溃斋。
2、大括號{}用來描述一組“不同類型的無序鍵值對集合”(每個鍵值對可以理解為OOP的屬性描述)详炬,方括號[]用來描述一組“相同類型的有序數據集合”(可對應OOP的數組)盐类。
3、上述兩種集合中若有多個子項呛谜,則通過英文逗號,進行分隔在跳。
4、鍵值對以英文冒號:進行分隔隐岛,鍵名都加上英文雙引號”"猫妙,以便于不同語言的解析。
5聚凹、JSON內部常用數據類型有 字符串割坠、數字、布爾妒牙、日期彼哼、null ,字符串必須用雙引號引起來湘今,其余的都不用敢朱,日期類型比較特殊,如果客戶端沒有按日期排序功能需求的話,那么可以把日期時間直接作為字符串傳遞
JSON實例:
//描述一個人
var person={"Name": "Bob","Age": 32,"Company": "IBM","Engineer":true}
//獲取這個人的信息var personAge=person.Age;
//描述幾個人
var members=[
{"Name": "Bob","Age": 32,"Company": "IBM","Engineer":true},
{"Name": "John","Age": 20,"Company": "Oracle","Engineer":false},
{"Name": "Henry","Age": 45,"Company": "Microsoft","Engineer":false}
]
//讀取其中John的公司名稱
var johnsCompany= members[1].Company;
//描述一次會議
var conference=
{"Conference": "Future Marketing","Date": "2012-6-1","Address": "Beijing","Members":
[
{"Name": "Bob","Age": 32,"Company": "IBM","Engineer":true},
{"Name": "John","Age": 20,"Company": "Oracle","Engineer":false},
{"Name": "Henry","Age": 45,"Company": "Microsoft","Engineer":false}
]
}
jsonp
1拴签、Ajax直接請求普通文件存在跨域無權限訪問的問題
2孝常、Web頁面上調用js文件時則不受是否跨域的影響,凡是擁有”src”這個屬性的標簽都擁有跨域的能力JSON的純字符數據格式可以簡潔的描述復雜數據,JSON還被js原生支持,為了便于客戶端使用數據蚓哩,逐漸形成了一種非正式傳輸協(xié)議构灸,人們把它稱作JSONP,該協(xié)議的一個要點就是允許用戶傳遞一個callback參數給服務端岸梨,然后服務端返回數據時會將這個callback參數作為函數名來包裹住JSON數據喜颁,這樣客戶端就可以隨意定制自己的函數來自動處理返回數據了。
JSONP的客戶端具體實現:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
// 得到信息查詢結果后的回調函數
var flightHandler = function(data){
alert('你查詢的航班結果是:票價 ' + data.price + ' 元曹阔,' + '余票 ' + data.tickets + ' 張洛巢。');
};
// 提供jsonp服務的url地址(不管是什么類型的地址,最終生成的返回值都是一段javascript代碼)
var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
// 創(chuàng)建script標簽次兆,設置其屬性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script標簽加入head稿茉,此時調用開始
document.getElementsByTagName('head')[0].appendChild(script);
</script>
</head>
<body>
</body>
</html>
jQuery中的jsonp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<script type="text/javascript" src=jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
$.ajax({
type: "get",
async: false,
url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
dataType: "jsonp",
jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback)
jsonpCallback:"flightHandler",//自定義的jsonp回調函數名稱芥炭,默認為jQuery自動生成的隨機函數名漓库,也可以寫"?",jQuery會自動為你處理數據
success: function(json){
alert('您查詢到航班信息:票價: ' + json.price + ' 元园蝠,余票: ' + json.tickets + ' 張渺蒿。');
},
error: function(){
alert('fail');
}
});
});
</script>
</head>
<body>
</body>
</html>