轉(zhuǎn)義字符(\)對(duì)JavaScript中JSON.parse的影響概述
更新時(shí)間:2013年07月17日 17:42:43 作者:
JSON是一個(gè)提供了stringify和parse方法的內(nèi)置對(duì)象,前者用于將js對(duì)象轉(zhuǎn)化為符合json標(biāo)準(zhǔn)的字符串,后者將符合json標(biāo)準(zhǔn)的字符串轉(zhuǎn)化為js對(duì)象,本文為大家介紹下轉(zhuǎn)義字符對(duì)JSON.parse方法的影響
按照ECMA262第五版中的解釋,JSON是一個(gè)提供了stringify和parse方法的內(nèi)置對(duì)象,前者用于將js對(duì)象轉(zhuǎn)化為符合json標(biāo)準(zhǔn)的字符串,后者將符合json標(biāo)準(zhǔn)的字符串轉(zhuǎn)化為js對(duì)象。json標(biāo)準(zhǔn)參考<a target="_blank">json.org</a>。(其實(shí)將符合json標(biāo)準(zhǔn)的字符串轉(zhuǎn)化為js對(duì)象可以用eval,但是eval性能相對(duì)差且存在安全隱患(會(huì)執(zhí)行json字符串中的代碼),本文僅寫JSON)
本文寫的是轉(zhuǎn)義字符對(duì)JSON.parse方法的影響。
一般來(lái)說(shuō)在JSON.parse的參數(shù)包含轉(zhuǎn)移字符的時(shí)候會(huì)遇到兩次轉(zhuǎn)義的問(wèn)題,其實(shí)第一次是字符串本身的轉(zhuǎn)義,第二次是將真正轉(zhuǎn)為js對(duì)象的轉(zhuǎn)義。
舉例如下:
例子一:將字符串'{"a":"b","b":"\\\\"}'傳遞給JSON.parse,首先解析器提取單引號(hào)括起來(lái)的字符串時(shí)認(rèn)為第一個(gè)\轉(zhuǎn)義第二個(gè)\ 第三個(gè)\轉(zhuǎn)義第四個(gè)\,也就是說(shuō)實(shí)際可輸出字符串是{"a":"b","b":"\\"}(可通過(guò)console.log('{"a":"b","b":"\\\\"}')驗(yàn)證),之后正式轉(zhuǎn)為js對(duì)象的時(shí)候還有一次轉(zhuǎn)義,也就是實(shí)際輸出字符轉(zhuǎn)中的第一個(gè)\轉(zhuǎn)義第二個(gè)\(此時(shí)只有兩個(gè)\)。所以console.log(JSON.parse('{"a":"b","b":"\\\\"}') );輸出結(jié)果為Object {a: "b", b: "\"},也就是說(shuō)實(shí)際顯示的數(shù)據(jù)為一個(gè)\(實(shí)際可輸出一個(gè)\說(shuō)明在此之前還有一個(gè)\)。
例子二:
var obj = {
a : "b",
b : "\\",
c : {
b : "\\",
a : {
b : "\\"
}
}
};
var json_str = JSON.stringify(obj);
console.log( JSON.stringify(obj) );
console.dir(JSON.parse(json_str));
console.dir(JSON.parse('{"a":"b","b":"\\\\","c":{"b":"\\\\","a":{"b":"\\\\"}}}'));輸出結(jié)果如下圖
pic
根據(jù)轉(zhuǎn)義規(guī)則,實(shí)際輸出一個(gè)\在這個(gè)\之前必定有一個(gè)\。所以如上第一行輸出按照書寫來(lái)說(shuō)為'{"a":"b","b":"\\\\","c":{"b":"\\\\","a":{"b":"\\\\"}}}',可通過(guò)第三條輸出來(lái)驗(yàn)證。
總結(jié),如果想在js對(duì)象中出現(xiàn)一個(gè)\,需要在json字符串中出現(xiàn)四個(gè)\ 。
對(duì)于其他的其他的特殊字符
1.雙引號(hào)("),如果正確出現(xiàn)雙引號(hào)應(yīng)為\\\"
2.\n,如想想出現(xiàn)正確的換行需要json字符串中是\\n,其實(shí)是先對(duì)\n中的\轉(zhuǎn)義,n變成了普通字符,在解析為js對(duì)象的時(shí)候n與之前的\(只有一個(gè)\了)被解釋為換行。如下的兩個(gè)與此類似。
3.\r,\\r
4.\t,\\t
本文寫的是轉(zhuǎn)義字符對(duì)JSON.parse方法的影響。
一般來(lái)說(shuō)在JSON.parse的參數(shù)包含轉(zhuǎn)移字符的時(shí)候會(huì)遇到兩次轉(zhuǎn)義的問(wèn)題,其實(shí)第一次是字符串本身的轉(zhuǎn)義,第二次是將真正轉(zhuǎn)為js對(duì)象的轉(zhuǎn)義。
舉例如下:
例子一:將字符串'{"a":"b","b":"\\\\"}'傳遞給JSON.parse,首先解析器提取單引號(hào)括起來(lái)的字符串時(shí)認(rèn)為第一個(gè)\轉(zhuǎn)義第二個(gè)\ 第三個(gè)\轉(zhuǎn)義第四個(gè)\,也就是說(shuō)實(shí)際可輸出字符串是{"a":"b","b":"\\"}(可通過(guò)console.log('{"a":"b","b":"\\\\"}')驗(yàn)證),之后正式轉(zhuǎn)為js對(duì)象的時(shí)候還有一次轉(zhuǎn)義,也就是實(shí)際輸出字符轉(zhuǎn)中的第一個(gè)\轉(zhuǎn)義第二個(gè)\(此時(shí)只有兩個(gè)\)。所以console.log(JSON.parse('{"a":"b","b":"\\\\"}') );輸出結(jié)果為Object {a: "b", b: "\"},也就是說(shuō)實(shí)際顯示的數(shù)據(jù)為一個(gè)\(實(shí)際可輸出一個(gè)\說(shuō)明在此之前還有一個(gè)\)。
例子二:
var obj = {
a : "b",
b : "\\",
c : {
b : "\\",
a : {
b : "\\"
}
}
};
var json_str = JSON.stringify(obj);
console.log( JSON.stringify(obj) );
console.dir(JSON.parse(json_str));
console.dir(JSON.parse('{"a":"b","b":"\\\\","c":{"b":"\\\\","a":{"b":"\\\\"}}}'));輸出結(jié)果如下圖
pic
根據(jù)轉(zhuǎn)義規(guī)則,實(shí)際輸出一個(gè)\在這個(gè)\之前必定有一個(gè)\。所以如上第一行輸出按照書寫來(lái)說(shuō)為'{"a":"b","b":"\\\\","c":{"b":"\\\\","a":{"b":"\\\\"}}}',可通過(guò)第三條輸出來(lái)驗(yàn)證。
總結(jié),如果想在js對(duì)象中出現(xiàn)一個(gè)\,需要在json字符串中出現(xiàn)四個(gè)\ 。
對(duì)于其他的其他的特殊字符
1.雙引號(hào)("),如果正確出現(xiàn)雙引號(hào)應(yīng)為\\\"
2.\n,如想想出現(xiàn)正確的換行需要json字符串中是\\n,其實(shí)是先對(duì)\n中的\轉(zhuǎn)義,n變成了普通字符,在解析為js對(duì)象的時(shí)候n與之前的\(只有一個(gè)\了)被解釋為換行。如下的兩個(gè)與此類似。
3.\r,\\r
4.\t,\\t
相關(guān)文章
javascript學(xué)習(xí)筆記(八)正則表達(dá)式
這篇文章本來(lái)很早就要寫的,主要介紹一下javascript正則表達(dá)式,拖了挺久的,現(xiàn)在整理下,供大家學(xué)習(xí)交流哈!2014-10-10
深入理解JavaScript系列(21):S.O.L.I.D五大原則之接口隔離原則ISP詳解
這篇文章主要介紹了深入理解JavaScript系列(21):S.O.L.I.D五大原則之接口隔離原則ISP詳解,本文講解了JavaScript接口、ISP與JavaScript、墮落的實(shí)現(xiàn)、靜態(tài)耦合、語(yǔ)義耦合、可擴(kuò)展性等內(nèi)容,需要的朋友可以參考下2015-03-03
Internet Explorer 11 瀏覽器介紹:別叫我IE
這篇文章主要介紹了Internet Explorer 11 瀏覽器介紹:別叫我IE,需要的朋友可以參考下2014-09-09
a標(biāo)簽的href與onclick事件的區(qū)別詳解
對(duì)于a標(biāo)簽的href與onclick事件,大家都經(jīng)常見(jiàn)到,也經(jīng)常使用,可它們有什么區(qū)別呢?下面就讓小編來(lái)給大家詳細(xì)介紹下,感興趣的朋友可以學(xué)習(xí)下,不用謝了,哈哈2014-11-11
JavaScript事件處理器中的event參數(shù)使用介紹
當(dāng)一個(gè)事件處理器被觸發(fā)時(shí),名為Event的類實(shí)例會(huì)作為第一個(gè)參數(shù)傳入處理器中,下面為大家詳細(xì)介紹下它的應(yīng)用2013-05-05
深入理解JavaScript系列(45):代碼復(fù)用模式(避免篇)詳解
這篇文章主要介紹了深入理解JavaScript系列(45):代碼復(fù)用模式(避免篇)詳解,本文講解了默認(rèn)模式、借用構(gòu)造函數(shù)、借用構(gòu)造函數(shù)并設(shè)置原型、共享原型、臨時(shí)構(gòu)造函數(shù)、klass等內(nèi)容,需要的朋友可以參考下2015-03-03

