1.背景介紹
JSON一種數(shù)據(jù)交換格式尚卫。在JSON出現(xiàn)之前归榕, 大家一直用XML來(lái)傳遞數(shù)據(jù)。因?yàn)閄ML是一種純文本格式吱涉,所以它適合在網(wǎng)絡(luò)上交換數(shù)據(jù)刹泄。XML本身不算復(fù)雜,但是怎爵, 加上DTD特石、XSD、XPath鳖链、XSLT等一大堆復(fù)雜的規(guī)范以后姆蘸,即使你努力鉆研幾個(gè)月,也未必搞得清楚XML的規(guī)范芙委。
終于逞敷,在2002年的一天,道格拉斯·克羅克福特發(fā)明了JSON這種超輕量級(jí)的數(shù)據(jù)交換格式灌侣。
由于JSON非常簡(jiǎn)單推捐,很快就風(fēng)靡Web世界。而在JavaScript中侧啼,我們可 以直接使用JSON牛柒,因?yàn)镴avaScript內(nèi)置了JSON的解析堪簿。把任何JavaScript對(duì)象變成JSON,就是把這個(gè)對(duì)象序列化成一個(gè)JSON 格式的字符串皮壁,這樣才能夠通過(guò)網(wǎng)絡(luò)傳遞給其他計(jì)算機(jī)椭更。如果我們收到一個(gè)JSON格式的字符串,只需要把它反序列化成一個(gè)JavaS cript對(duì)象闪彼,就可以在JavaScript中直接使用這個(gè)對(duì)象了甜孤。
2.知識(shí)剖析
JSON語(yǔ)法
數(shù)據(jù)在名稱/值對(duì)中
數(shù)據(jù)由逗號(hào)分隔
大括號(hào)保存對(duì)象
中括號(hào)保存數(shù)組
JSON值
數(shù)字(整數(shù)/浮點(diǎn)數(shù))
字符串(雙引號(hào))
布爾值(true/false)
數(shù)組(中括號(hào)中)
對(duì)象(大括號(hào)中)
null
實(shí)例
JSON 數(shù)據(jù)的書寫格式是:名稱/值對(duì)。
名稱/值對(duì)組合中的名稱寫在前面(在雙引號(hào)中)畏腕,值對(duì)寫在后面,中間用冒號(hào)隔開(kāi)茉稠,
其中 值 可以是:數(shù)字(整數(shù)或浮點(diǎn)數(shù))描馅、字符串(在雙引號(hào)中)、邏輯值(true或false)而线、數(shù)組(在方括號(hào)中)铭污、對(duì)象(在花括號(hào)中)、null
使用方式:
varjson= {"name":"myname","password":123456}
或者是嵌套使用
? ? ? ? ? ? ? ? ? ? ? myObj = {
? ? ? ? ? ? ? ? ? ? ? ? ? "name":"runoob",
? ? ? ? ? ? ? ? ? ? ? ? ? "alexa":10000,
? ? ? ? ? ? ? ? ? ? ? ? ? "sites": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "site1":"www.runoob.com",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "site2":"m.runoob.com",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "site3":"c.runoob.com"
? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? console.log(myObj)
//輸出結(jié)果:
Object {name: "runoob", alexa: 10000, sites: Object}
轉(zhuǎn)義概述
為什么需要轉(zhuǎn)義膀篮?在js中我們使用的js對(duì)象進(jìn)行處理嘹狞,但是在與后端數(shù)據(jù)交換的時(shí)候,我們發(fā)送規(guī)定的json格式的字符串誓竿,所以在給后端發(fā)送或接受數(shù)據(jù)的時(shí)候磅网,需要
{name:"myname",password:123456} <–> "{"name":"myname","password":123456}"
其中json字符串轉(zhuǎn)js對(duì)象,調(diào)用parse方法:
js對(duì)象 = JSON.parse(json字符串);
js對(duì)象轉(zhuǎn)json字符串筷屡,調(diào)用stringify方法:
json字符串 = JSON.stringify(js對(duì)象);
3.常見(jiàn)問(wèn)題
除了以上兩種方法還有什么可以轉(zhuǎn)化
4.解決方案
用eval_r('('+json字符串+')')這個(gè)方法可以實(shí)現(xiàn)json計(jì)算
var value = 1;
var js = '{"data1":"hello","data2":value++}';
console.log(js);
var data1 = eval("("+js+")");
console.log(data1);
var data2=JSON.stringify(js);
console.log(data2);
eval_r獲取的json對(duì)象的值中涧偷,如果有執(zhí)行代碼,也將照樣執(zhí)行毙死!所以若不能保證數(shù)據(jù)的安全性燎潮,不要使用eval_r方法進(jìn)行轉(zhuǎn)義。
6.擴(kuò)展思考
我們扯筇龋看到{name:"myname",password:123456}和{"name":"myname","password":123456}這樣兩種格式确封,即js對(duì)象和json,然而js對(duì)象和json有什么不一樣的地方再菊?
一個(gè)栗子大家可以自己在瀏覽器上運(yùn)行一下
<script>
var jso1={
a:"name","b":"age"
};
var jso2={
"a":"name","b":"age"
};
console.log(jso1.a === jso2.a);
console.log(jso1.b === jso2.b);
console.log(jso1 === jso2);
console.log(jso1);
console.log(jso2);
var jso3=JSON.stringify(jso1);
console.log(jso3);
var jso4=JSON.parse({
'a':"name","b":"age"
});
var jso4=JSON.parse('{\"a\":\"name\", \"b\":\"age\"}');
console.log(jso4);
</script>
7.參考文獻(xiàn)
參考一:百度百科
參考二:Json對(duì)象和Json字符串的區(qū)別
8.更多討論
如何寫一個(gè)json解析器爪喘?
提問(wèn):
? ? Q:JSON對(duì)象有什么遍歷方法,如何做
????A:用jq方法$.each遍歷json對(duì)象
? ? Q:angularjs如何轉(zhuǎn)換字符串和對(duì)象
? ? A:angular.fromJson(?);
????????angular.toJson();
Q:json和jisonp有什么區(qū)別
A:json返回的是一串?dāng)?shù)據(jù)袄简;而jsonp返回的是腳本代碼(包含一個(gè)函數(shù)調(diào)用)