JSON是什么炭菌,如何處理轉(zhuǎn)義?

大家好~ ?我是一枚正直純潔的苦逼程序員9渎:诘汀!!克握!

1.背景介紹

什么是JSON

JSON (JavaScript Object Notation, JS 對象標記) 是一種輕量級的數(shù)據(jù)交換格式蕾管。它基于 ECMAScript (w3c制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)菩暗。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言掰曾。 易于人閱讀和編寫,同時也易于機器解析和生成停团,并有效地提升網(wǎng)絡(luò)傳輸效率旷坦。

——百度百科

數(shù)據(jù)傳輸是我們在敲代碼時,經(jīng)常遇到的一個場景,前后端交互佑稠。給數(shù)據(jù)一個統(tǒng)一的格式有利于我們編寫和解析數(shù)據(jù)秒梅。

json,是一種數(shù)據(jù)格式舌胶,在與后端的數(shù)據(jù)交互中有較為廣泛的應(yīng)用捆蜀。

JSON的誕生

JSON是 (JavaScript Object Notation, JS 對象標記),它是一種數(shù)據(jù)交換格式辆琅。在JSON出現(xiàn)之前漱办,大家一直用XML來傳遞數(shù)據(jù)。因為XML是一種純文本格式婉烟,所以它適合在網(wǎng)絡(luò)上交換數(shù)據(jù)娩井。XML本身不算復(fù)雜,但是似袁,加上DTD洞辣、XSD、XPath昙衅、XSLT等一大堆復(fù)雜的規(guī)范以后扬霜,任何正常的軟件開發(fā)人員碰到XML都會感覺頭大了,最后大家發(fā)現(xiàn)而涉,即使你努力鉆研幾個月著瓶,也未必搞得清楚XML的規(guī)范。

終于啼县,在2002年的一天材原,道格拉斯·克羅克福特(DouglasCrockford)同學(xué)為了拯救深陷水深火熱同時又被某幾個巨型軟件企業(yè)長期愚弄的軟件工程師,發(fā)明了JSON這種超輕量級的數(shù)據(jù)交換格式季眷。

由于JSON非常簡單余蟹,很快就風(fēng)靡Web世界,并且成為ECMA標準子刮。幾乎所有編程語言都有解析JSON的庫威酒,而在JavaScript中,我們可以直接使用JSON,因為JavaScript內(nèi)置了JSON的解析葵孤。把任何JavaScript對象變成JSON担钮,就是把這個對象序列化成一個JSON格式的字符串,這樣才能夠通過網(wǎng)絡(luò)傳遞給其他計算機佛呻。如果我們收到一個JSON格式的字符串裳朋,只需要把它反序列化成一個JavaScript對象,就可以在JavaScript中直接使用這個對象了吓著。

轉(zhuǎn)義

我們在調(diào)用 jsonp 接口或者調(diào)用js文件的時候鲤嫡,由于文件編碼不同會導(dǎo)致出現(xiàn)亂碼的問題。 如果你的文件出現(xiàn)了非英文字符绑莺,如果調(diào)用時文件編碼不一致暖眼,同樣會出現(xiàn)亂碼情況。

這也就是為什么要數(shù)據(jù)統(tǒng)一格式的原因纺裁。

JSON 是適用于 Ajax 應(yīng)用程序的一種有效格式诫肠,原因是它使 JavaScript 對象和字符串值之間得以快速轉(zhuǎn)換 JSON是一種傳遞對象的語法

JSON是一個提供了stringify和parse方法的內(nèi)置對象?

stringify將js對象轉(zhuǎn)化為符合json標準的字符串

parse將符合json標準的字符串轉(zhuǎn)化為js對象

2.知識剖析

JSON語法

數(shù)據(jù)在名稱/值對中

數(shù)據(jù)由逗號分隔

大括號保存對象

中括號保存數(shù)組


JSON值

數(shù)字(整數(shù)/浮點數(shù))

字符串(雙引號)

布爾值(true/false)

數(shù)組(中括號中)

對象(大括號中)

null

實例

JSON 數(shù)據(jù)的書寫格式是:名稱/值對。

名稱/值對組合中的名稱寫在前面(在雙引號中)欺缘,值對寫在后面栋豫,中間用冒號隔開,

其中 值 可以是:數(shù)字(整數(shù)或浮點數(shù))谚殊、字符串(在雙引號中)丧鸯、布爾值(true或false)、數(shù)組(在方括號中)嫩絮、對象(在花括號中)丛肢、null

使用方式:

var json = {"password":123456,"name":"myname","Booleans":true,"Array":[1,2,3],"object":{}}


或者是嵌套使用

? ? ? ? ? ? ? ? ? ? ? myObj = {

? ? ? ? ? ? ? ? ? ? ? ? ? "name":"jnshu",

? ? ? ? ? ? ? ? ? ? ? ? ? "alexa":10086,

? ? ? ? ? ? ? ? ? ? ? ? ? "sites": {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "site1":"www.jnshu.com",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "site2":"m.jnshu.com",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "site3":"c.jnshu.com"

? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? console.log(myObj)

//輸出結(jié)果:

Object {name: "jnshu", alexa: 10086, sites: Object}


轉(zhuǎn)義概述

為什么需要轉(zhuǎn)義?在js中我們使用的js對象進行處理剿干,但是在與后端數(shù)據(jù)交換的時候蜂怎,我們發(fā)送規(guī)定的json格式的字符串,所以在給后端發(fā)送或接受數(shù)據(jù)的時候置尔,需要轉(zhuǎn)義

{name:"myname",password:"123456"}?

"{"name":"myname","password":"123456"}"

其中json字符串轉(zhuǎn)js對象杠步,調(diào)用parse方法:

js對象 = JSON.parse(json字符串);

js對象轉(zhuǎn)json字符串,調(diào)用stringify方法:

json字符串 = JSON.stringify(js對象);

3.常見問題

在json字符串轉(zhuǎn)換成對象榜轿,還有eval('('+json字符串+')')這個方法幽歼,但是在對目標數(shù)據(jù)進行讀取時,可能會出現(xiàn)一些意外的錯誤:

var value = 1;

var jsonstr = '{"data1":"hello","data2":++value}';

var data1 = eval('('+jsonstr+')');

console.log(data1);//這時value值為2

var data2=JSON.parse(jsonstr);

console.log(data2);//報錯

3.常見問題

在json字符串轉(zhuǎn)換成對象差导,還有eval('('+json字符串+')')這個方法,但是在對目標數(shù)據(jù)進行讀取時猪勇,可能會出現(xiàn)一些意外的錯誤:

var value = 1;

var jsonstr = '{"data1":"hello","data2":++value}';

var data1 = eval('('+jsonstr+')');

console.log(data1);//這時value值為2

var data2=JSON.parse(jsonstr);

console.log(data2);//報錯

4.解決方案

原因:eval獲取的json對象的值中设褐,如果有執(zhí)行代碼,也將照樣執(zhí)行!所以若不能保證數(shù)據(jù)的安全性助析,不要使用eval方法進行轉(zhuǎn)義犀被。

5.編碼實戰(zhàn)

下面是一個簡單的json數(shù)據(jù)發(fā)送應(yīng)用,有興趣可以閱讀一下:

$(document).ready(function(){

? ? var saveDataAry=[];

? ? var data1={"userName":"test","address":"gz"};

? ? var data2={"userName":"ququ","address":"gr"};

? ? saveDataAry.push(data1);

? ? saveDataAry.push(data2);

? ? $.ajax({

? ? ? ? type:"POST",

? ? ? ? url:"user/saveUser",

? ? ? ? dataType:"json",

? ? ? ? contentType:"application/json",

? ? ? ? data:JSON.stringify(saveDataAry),

? ? ? ? success:function(data){

? ? ? ? }

? ? });

});

6.擴展思考

我們惩饧剑看到?

{name:"myname",password:123456}

{"name":"myname","password":123456}

這樣兩種格式寡键,即js對象和json,然而js對象和json有什么不一樣的地方雪隧?

很多人搞不清楚 JSON 和 Js 對象的關(guān)系西轩,甚至連誰是誰都不清楚。其實脑沿,可以這么理解:

JSON 是 JS 對象的字符串表示法藕畔,它使用文本表示一個 JS 對象的信息,本質(zhì)是一個字符串庄拇。

var obj = {a: 'Hello', b: 'World'}; //這是一個對象注服,注意鍵名也是可以使用引號包裹的

var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質(zhì)是一個字符串

JSON格式的對象與一般JS對象語法上的區(qū)別措近?

對比內(nèi)容JSONJS對象

鍵名必須是加雙引號可允許不加溶弟、加單引號、加雙引號

屬性值只能是數(shù)值(10進制)瞭郑、字符串(雙引號)辜御、布爾值和null,

也可以是數(shù)組或者符合JSON要求的對象凰浮,

不能是函數(shù)我抠、NaN, Infinity(存放表示正無窮大的數(shù)值), -Infinity和undefined

任意屬性值均可

逗號問題最后一個屬性后面不能有逗號可以有逗號

數(shù)值前導(dǎo)0不能用,小數(shù)點后必須有數(shù)字無限制

7.參考文獻

參考一:JSON官方文網(wǎng)

參考二:Json對象和Json字符串的區(qū)別

參考三:json屬性名必須加引號的討論

8.更多討論

問題一:


json字符串轉(zhuǎn)json對象,調(diào)用parse方法:

var b='{"name":"2323","sex":"afasdf","age":"6262"}'//json字符串var bToObject=JSON.parse(b);console.log(bToObject.name);//2323

json對象轉(zhuǎn)為json字符串:

vara={"name":"tom","sex":"男","age":"24"}//json對象varaToString=JSON.stringify(a);console.log(aToString);//{"name":"tom","sex":"男","age":"24"}

問題2


一般1引用于前后臺交互袜茧。

問題3


因為angular里面默認的是json

視頻

ppt

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菜拓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笛厦,更是在濱河造成了極大的恐慌纳鼎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裳凸,死亡現(xiàn)場離奇詭異贱鄙,居然都是意外死亡,警方通過查閱死者的電腦和手機姨谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門逗宁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梦湘,你說我怎么就攤上這事瞎颗〖” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵哼拔,是天一觀的道長引有。 經(jīng)常有香客問我,道長倦逐,這世上最難降的妖魔是什么譬正? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮檬姥,結(jié)果婚禮上曾我,老公的妹妹穿的比我還像新娘。我一直安慰自己穿铆,他們只是感情好您单,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荞雏,像睡著了一般虐秦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凤优,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天悦陋,我揣著相機與錄音,去河邊找鬼筑辨。 笑死俺驶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棍辕。 我是一名探鬼主播暮现,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼楚昭!你這毒婦竟也來了栖袋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抚太,失蹤者是張志新(化名)和其女友劉穎塘幅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尿贫,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡电媳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了庆亡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾乓。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖又谋,靈堂內(nèi)的尸體忽然破棺而出拼缝,到底是詐尸還是另有隱情括享,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布珍促,位于F島的核電站,受9級特大地震影響剩愧,放射性物質(zhì)發(fā)生泄漏猪叙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一仁卷、第九天 我趴在偏房一處隱蔽的房頂上張望穴翩。 院中可真熱鬧,春花似錦锦积、人聲如沸芒帕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽背蟆。三九已至,卻和暖如春哮幢,著一層夾襖步出監(jiān)牢的瞬間带膀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工橙垢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垛叨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓柜某,卻偏偏與公主長得像嗽元,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喂击,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容