javascript
JavaScript高级程序设计学习笔记第二十章--JSON
1.JSON:JavaScript Object Notation, JavaScript 對象表示法。
2.最重要的是要理解它是一種數(shù)據(jù)格式,不是一種編程語言。雖然具有相同的語法形式,但 JSON 并不從屬于 JavaScript。而且,并不是只有 JavaScript 才使用 JSON,畢竟 JSON 只是一種數(shù)據(jù)格式。很多編程語言都有針對 JSON 的解析器和序列化器。
3.語法:
JSON 的語法可以表示以下三種類型的值:
- 簡單值:使用與 JavaScript 相同的語法,可以在 JSON 中表示字符串、數(shù)值、布爾值和 null。但 JSON 不支持 JavaScript 中的特殊值 undefined。
- JavaScript 字符串與 JSON 字符串的最大區(qū)別在于, JSON 字符串必須使用雙引號(單引號會導(dǎo)致語法錯誤)。
- 對象:對象作為一種復(fù)雜數(shù)據(jù)類型,表示的是一組無序的鍵值對兒。而每個鍵值對兒中的值可以是簡單值,也可以是復(fù)雜數(shù)據(jù)類型的值。
- 與 JavaScript 的對象字面量相比, JSON 對象有兩個地方不一樣。首先,沒有聲明變量(JSON 中沒有變量的概念)。其次,沒有末尾的分號(因為這不是 JavaScript 語句,所以不需要分號)。再說一遍,對象的屬性必須加雙引號,這在 JSON 中是必需的。屬性的值可以是簡單值,也可以是復(fù)雜類型值。例如:
- 1 //javascript對象字面量 2 var person = { 3 name: "Nicholas", 4 age: 29 5 }; 6 //JSON變量 7 { 8 "name": "Nicholas", 9 "age": 29 10 }
- 數(shù)組:數(shù)組也是一種復(fù)雜數(shù)據(jù)類型,表示一組有序的值的列表,可以通過數(shù)值索引來訪問其中的值。數(shù)組的值也可以是任意類型——簡單值、對象或數(shù)組。
- JSON 數(shù)組沒有變量和分號,例如:
- 1 //JavaScript 中的數(shù)組字面量 2 var values = [25, "hi", true]; 3 4 //JSON表示數(shù)組 5 [25, "hi", true]
- JSON 不支持變量、函數(shù)或?qū)ο髮嵗?/li>
?
解析與序列化:
JSON 之所以流行,更重要的一個原因是,可以把JSON 數(shù)據(jù)結(jié)構(gòu)解析為有用的 JavaScript 對象。
JSON 對象有兩個方法: stringify()和 parse()。在最簡單的情況下,這兩個方法分別用于把JavaScript 對象序列化為 JSON 字符串和把 JSON 字符串解析為原生 JavaScript 值。
序列化:
例如:
1 var book = { 2 title: "Professional JavaScript", 3 authors: [ 4 "Nicholas C. Zakas" 5 ], 6 edition: 3, 7 year: 2011 8 }; 9 var jsonText = JSON.stringify(book);//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3, 10 "year":2011}在序列化 JavaScript 對象時,所有函數(shù)及原型成員都會被有意忽略,不體現(xiàn)在結(jié)果中。此外,值為undefined 的任何屬性也都會被跳過。
實際上, JSON.stringify()除了要序列化的 JavaScript 對象外,還可以接收另外兩個參數(shù),這兩個參數(shù)用于指定以不同的方式序列化 JavaScript 對象。第一個參數(shù)是個過濾器,可以是一個數(shù)組,也可以是一個函數(shù);第二個參數(shù)是一個選項,表示是否在 JSON 字符串中保留縮進。
如果過濾器參數(shù)是數(shù)組,那么 JSON.stringify()的結(jié)果中將只包含數(shù)組中列出的屬性。例如:
?
如果第二個參數(shù)是函數(shù),行為會稍有不同。傳入的函數(shù)接收兩個參數(shù),屬性(鍵)名和屬性值。根據(jù)屬性(鍵)名可以知道應(yīng)該如何處理要序列化的對象中的屬性。屬性名只能是字符串,而在值并非鍵值對兒結(jié)構(gòu)的值時,鍵名可以是空字符串。例如:
?
JSON.stringify()方法的第三個參數(shù)用于控制結(jié)果中的縮進和空白符。如果這個參數(shù)是一個數(shù)值,那它表示的是每個級別縮進的空格數(shù)。例如:
1 //每個級別縮進 4 個空格 2 var book = { 3 "title": "Professional JavaScript", 4 "authors": [ 5 "Nicholas C. Zakas" 6 ], 7 edition: 3, 8 year: 2011 9 }; 10 var jsonText = JSON.stringify(book, null, 4);保存在 jsonText 中的字符串如下所示:
1 { 2 "title": "Professional JavaScript", 3 "authors": [ 4 "Nicholas C. Zakas" 5 ], 6 "edition": 3, 7 "year": 2011 8 }//要 9 傳入有效的控制縮進的參數(shù)值,結(jié)果字符串就會包含換行符。(只縮進而不換行意義不大。)最大縮進空格數(shù)為 10,所有大于 10 的值都會自動轉(zhuǎn)換為 10。?
toJSON()方法:
自定義序列化的需求。
?
假設(shè)把一個對象傳入 JSON.stringify(),序列化該對象的順序如下:
- 如果存在 toJSON()方法而且能通過它取得有效的值,則調(diào)用該方法。否則,返回對象本身。
- 如果提供了第二個參數(shù),應(yīng)用這個函數(shù)過濾器。傳入函數(shù)過濾器的值是第(1)步返回的值。
- 對第(2)步返回的每個值進行相應(yīng)的序列化。
- 如果提供了第三個參數(shù),執(zhí)行相應(yīng)的格式化。
?
解析:
?
將 JSON 字符串直接傳遞給 JSON.parse()就可以得到相應(yīng)的 JavaScript 值。例如,使用下列代碼就可以創(chuàng)建與 book 類似的對象:?var bookCopy = JSON.parse(jsonText);?
JSON.parse()方法也可以接收另一個參數(shù),該參數(shù)是一個函數(shù),接收兩個參數(shù),一個鍵和一個值,而且都需要返回一個值。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangxiaoguai132/p/5190478.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript高级程序设计学习笔记第二十章--JSON的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT 1065 A+B and C (
- 下一篇: MySQL 5.6 my.cnf 参数说