本文實(shí)例講述了JavaScript解析及序列化JSON的方法。分享給大家供大家參考,具體如下:
JSON 之所以這么流行,是因?yàn)?JSON 數(shù)據(jù)結(jié)構(gòu)可以被解析為 JavaScript 對(duì)象。JSON 之前的 XML 數(shù)據(jù)結(jié)構(gòu)要被解析,需要先解析成 DOM 文檔,然后再?gòu)闹刑崛〕鰯?shù)據(jù)。相比之下,JSON 數(shù)據(jù)結(jié)構(gòu)方便多咯O(∩_∩)O~
所以 JSON 就成為 web 開(kāi)發(fā)中,用于數(shù)據(jù)交換的事實(shí)標(biāo)準(zhǔn)。
早期的 JSON 解析器是使用 JavaScript 的 eval() 函數(shù)。因?yàn)?JSON 是 JavaScript 語(yǔ)法的子集,所以 eval() 函數(shù)可以解析并返回 JavaScript 對(duì)象。但使用這個(gè)函數(shù)存在風(fēng)險(xiǎn),因?yàn)橛锌赡軙?huì)被執(zhí)行一些惡意的代碼!ECMAScript 5 定義了全局對(duì)象 JSON。支持這個(gè)對(duì)象的瀏覽器有 IE8+、Firefox 3.5+、Safari 4+、Chrome 和 Opera 10.5+。而舊版的瀏覽器建議使用 JSON-js 庫(kù)。
JSON 對(duì)象有兩個(gè)方法:
1. stringify(),會(huì)把 JavaScript 對(duì)象序列化為 JSON 字符串。
2. parse(),會(huì)把 JSON 字符串解析為原生的 JavaScript 對(duì)象。
<script type="text/javascript">var book = { title: "music", authors: ["deniro"], edition: 1, year: 2017};var jsonText = JSON.stringify(book);console.log(jsonText);var bookCopy = JSON.parse(jsonText);console.log(bookCopy);</script>默認(rèn)情況下,JSON.stringify() 輸出的字符串不包含任何空格字符以及縮進(jìn)。而且所有的函數(shù)以及原型成員都會(huì)被有意忽略。此外,值為 undefined 的屬性也會(huì)被跳過(guò)。所以結(jié)果中都是值為有效的屬性。
注意:上面代碼中的 book 與 bookCopy 雖然具有相同的屬性,但它們是兩個(gè)獨(dú)立的、沒(méi)有任何關(guān)系的對(duì)象。
如果傳給 JSON.parse() 的字符串不是有效的 JSON 字符串,就會(huì)拋出錯(cuò)誤。
JSON.stringify() 還可以接收另外兩個(gè)參數(shù)。第二個(gè)參數(shù)是過(guò)濾器,可以是數(shù)組,也可以是函數(shù);第三個(gè)參數(shù)表示是否在 JSON 字符串中保留縮進(jìn)。
如果過(guò)濾器的參數(shù)是數(shù)組,那么結(jié)果中將只會(huì)包含這個(gè)數(shù)組所列出的屬性:
<script type="text/javascript">var book = { title: "music", authors: ["deniro"], edition: 1, year: 2017};//過(guò)濾結(jié)果var jsonTextAfterFilter=JSON.stringify(book,["title","edition"]);console.log(jsonTextAfterFilter);//{"title":"music","edition":1}</script>如果過(guò)濾器的參數(shù)是函數(shù),那么這個(gè)函數(shù)會(huì)接收兩個(gè)參數(shù),屬性名和屬性值。屬性名只能是字符串,如果它所對(duì)應(yīng)的屬性值不是鍵值對(duì)結(jié)構(gòu)的值時(shí),那么屬性名可以是空字符串。這個(gè)函數(shù)的返回值就是相應(yīng)屬性名對(duì)應(yīng)的值。如果函數(shù)返回 undefined,那么相應(yīng)的屬性就會(huì)被忽略:
<script type="text/javascript"> var book = { title: "music", authors: ["deniro"], edition: 1, year: 2017 }; var jsonText = JSON.stringify(book, function (key, value) { switch (key) { case "authors": return value.join(","); case "year": return 10000; case "edition": return undefined; default : return value; } }); console.log(jsonText);//{"title":"music","authors":"deniro","year":10000}</script>
|
新聞熱點(diǎn)
疑難解答
圖片精選