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

大家好~ ?我是一枚正直純潔的苦逼程序員!!!!!

1.背景介紹

什么是JSON

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

——百度百科

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

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

JSON的誕生

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

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

由于JSON非常簡單,很快就風(fēng)靡Web世界,并且成為ECMA標(biāo)準(zhǔn)。幾乎所有編程語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,因?yàn)镴avaScript內(nèi)置了JSON的解析。把任何JavaScript對象變成JSON,就是把這個(gè)對象序列化成一個(gè)JSON格式的字符串,這樣才能夠通過網(wǎng)絡(luò)傳遞給其他計(jì)算機(jī)。如果我們收到一個(gè)JSON格式的字符串,只需要把它反序列化成一個(gè)JavaScript對象,就可以在JavaScript中直接使用這個(gè)對象了。

轉(zhuǎn)義

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

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

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

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

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

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

2.知識剖析

JSON語法

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

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

大括號保存對象

中括號保存數(shù)組


JSON值

數(shù)字(整數(shù)/浮點(diǎn)數(shù))

字符串(雙引號)

布爾值(true/false)

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

對象(大括號中)

null

實(shí)例

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

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

其中 值 可以是:數(shù)字(整數(shù)或浮點(diǎn)數(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對象進(jìn)行處理,但是在與后端數(shù)據(jù)交換的時(shí)候,我們發(fā)送規(guī)定的json格式的字符串,所以在給后端發(fā)送或接受數(shù)據(jù)的時(shí)候,需要轉(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字符串+')')這個(gè)方法,但是在對目標(biāo)數(shù)據(jù)進(jìn)行讀取時(shí),可能會出現(xiàn)一些意外的錯(cuò)誤:

var value = 1;

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

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

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

var data2=JSON.parse(jsonstr);

console.log(data2);//報(bào)錯(cuò)

3.常見問題

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

var value = 1;

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

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

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

var data2=JSON.parse(jsonstr);

console.log(data2);//報(bào)錯(cuò)

4.解決方案

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

5.編碼實(shí)戰(zhàn)

下面是一個(gè)簡單的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.擴(kuò)展思考

我們常看到?

{name:"myname",password:123456}

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

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

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

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

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

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

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

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

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

屬性值只能是數(shù)值(10進(jìn)制)、字符串(雙引號)、布爾值和null,

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

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

任意屬性值均可

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

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

7.參考文獻(xiàn)

參考一: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


因?yàn)閍ngular里面默認(rèn)的是json

視頻

ppt

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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