亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript中json基礎知識詳解

2019-11-19 17:52:25
字體:
來源:轉載
供稿:網友

大致介紹

JSON(JavaScript Object Notation  JavaScript對象表示法),JSON是一種數據格式,不是一種編程語言。雖然它的名字中有JavaScript但是它卻不屬于JavaScript,就像Java和JavaScript的關系一樣。而且,并不是只有JavaScript才使用它,畢竟 JSON 只是一種數據格式。很多編程語言都有針對 JSON 的解析器和序列化器。

JSON是由Douglas Crockford在2001年提出,為了取代XML

語法

JSON的語法可以包含三種類型的值:

 ◆ 簡單值

 ◆ 對象

 ◆ 數組

簡單值

簡單值:使用與 JavaScript 相同的語法,可以在 JSON 中表示字符串、數值、布爾值和 null

注意:【1】JSON 不支持 JavaScript 中的特殊值 undefined

           【2】JSON 字符串必須使用雙引號(單引號會導致語 法錯誤)

 // 有效的JSON數據 "Hellow World!" 5 true null

對象

對象作為一種復雜的數據類型,表示的是一組有序的鍵值對,每個鍵值對中的值既可以是簡單值也可以是復雜數據類型的值

JSON中的對象和JavaScript中的字面量稍微有一些不同:

  1、沒有聲明變量

  2、在末尾不需要加分號

  3、JSON 中對象的屬性名任何時候都必須加雙引號

注意:同一個對象中絕對不應該出現兩個同名屬性

// JavaScript中的字面量 var person = { name : "Lao Wang", age : 21 }; // JSON { "name" : "Lao Wang", "age" : 21 } // 可以在對象中嵌入對象 { "name" : "Lao Wang", "age" : 21, "school" : { "name" : "TJLG", "location" : "西青" } }

數組

JSON 數組采用的就是 JavaScript 中的數組字面量形式

 // JavaScript var values = [21,"西青",true]; // JSON values = [21,"西青",true]

JSON對象

早期的 JSON 解析器基本上就是使用 JavaScript 的 eval()函數。由于 JSON 是 JavaScript 語法的子 集,因此 eval()函數可以解析、解釋并返回 JavaScript 對象和數組,但是使用eval()函數對JSON數據結構求值存在風險,應為可能會執行一些惡意代碼,所以要盡量少的使用eval()函數

ECMAScript 5 對解析 JSON 的行 為進行規范,定義了全局對象 JSON。支持這個對象的瀏覽器有 IE 8+、Firefox 3.5+、Safari 4+、Chrome 和 Opera 10.5+。對于較早版本的瀏覽器,可以使用一個 shim:https://github.com/douglascrockford/JSON-js。

JSON對象有兩個方法:

1、stringify()

2、parse()

stringify()

stringify()方法將JavaScript對象序列化為JSON字符串

注意:

【1】默認情況下,JSON.stringify()輸出的 JSON 字符串不包含任何空格字符或縮進

var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" } }; var jsonPerson = JSON.stringify(person); console.log(jsonPerson); // {"name":"Lao Wang","grade":{"English":"88","Math":"98"}}

【2】 如果對象的成員是undefined或者函數,該成員會被忽略

如果數組的成員是undefined或者函數,則這些值會被轉成null

var person = { name : function(){}, sex : undefined, age : 21, grade : [undefined,function(){},"English"], } var jsonPerson = JSON.stringify(person); console.log(jsonPerson); // {"age":21,"grade":[null,null,"English"]}

【3】JSON.stringify()會忽略對象的不可遍歷屬性

var person = {}; Object.defineProperties(person,{ 'name' : { value : "Lao Wang", enumerable : true }, 'age' : { value : 21, enumerable : false } }); var jsonPerson = JSON.stringify(person); console.log(jsonPerson); // {"name":"Lao Wang"}

實際上,JSON.stringify()除了要序列化的 JavaScript 對象外,還可以接收另外兩個參數,這兩 個參數用于指定以不同的方式序列化 JavaScript 對象

第一個參數是個過濾器,可以是一個數組,也可 以是一個函數

第二個參數是一個選項,表示是否在 JSON 字符串中保留縮進

1、當第一個參數是數組時

如果過濾器參數是數組,那么 JSON.stringify()的結果中將只包含數組中列出的屬性

注意:

【1】、過濾器只對對象的第一層屬性有效

var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" } }; var jsonPerson = JSON.stringify(person,["name","Math"]); console.log(jsonPerson); // {"name":"Lao Wang"}

【2】過濾器對數組無效

 var values = [21,"he",true,"we"]; var jsonValues = JSON.stringify(values,["he"]); console.log(jsonValues); // [21,"he",true,"we"]

2、當第一個參數是函數時

傳入的函數接收兩個參數,屬性(鍵)名和屬性值。根據屬性(鍵)名可以知道應該如何處理要序列化的對象中的屬性。屬性名只能是字符串,而在值并非鍵值對兒結構的值時,鍵名可以是空字符串。 為了改變序列化對象的結果,函數返回的值就是相應鍵的值。

注意:如果函數返回了undefined或沒有返回值,那么相應的屬性會被忽略

var values = { name : "Lao Wang", age : 21, sex : "男" } var jsonValues = JSON.stringify(values,function(key,value){ if(key == "sex"){ return undefined; }else{ return value; } }); console.log(jsonValues); // {"name":"Lao Wang","age":21}

3、當給定第三個參數時

JSON.stringify()方法的第三個參數用于控制結果中的縮進和空白符。如果這個參數是一個數值,那它表示的是每個級別縮進的空格數

注意:

【1】只要傳入有效的控制縮進的參數值,結果字符串就會包含換行符

【2】最大縮進空格數為10,所有大于10的值都會自動轉換為10

【3】如果縮進參數是一個字符串而非數值,則這個字符串將在 JSON 字符串中被用作縮進字符(不再使用空格)

// 參數是數值 var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" } }; var jsonPerson = JSON.stringify(person,null,4); console.log(jsonPerson); /* { "name": "Lao Wang", "grade": { "English": "88", "Math": "98" } } */ // 參數是字符串 var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" } }; var jsonPerson = JSON.stringify(person,null,"-_-||"); console.log(jsonPerson); /*  { -_-||"name": "Lao Wang", -_-||"grade": { -_-||-_-||"English": "88", -_-||-_-||"Math": "98" -_-||} } */

toJSON()

有時候,JSON.stringify()還是不能滿足對某些對象進行自定義序列化的需求。在這些情況下, 可以通過對象上調用toJSON()方法,返回其自身的JSON數據格式

var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" }, toJSON : function(){ return "toJSON方法"; } }; var jsonPerson = JSON.stringify(person); console.log(jsonPerson); // "toJSON方法"

注意:如果toJSON()方法返回undefined,此時如果包含它的對象嵌入在另一個對象中,會導致該對象的值變成null。而如果包含它的對象是頂級對象,結果就是undefined

// 嵌入在另一個對象中 var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" }, sex : { value : "男", toJSON : function(){ return undefined; } } }; var jsonPerson = JSON.stringify(person,null,4); console.log(jsonPerson); /* { "name": "Lao Wang", "grade": { "English": "88", "Math": "98" } } */ // 嵌入頂級對象 var person = { name : "Lao Wang", grade : { "English" : "88", "Math" : "98" }, toJSON : function(){ return undefined; } }; var jsonPerson = JSON.stringify(person,null,4); console.log(jsonPerson); // undefined

原生Date對象有一個toJSON()方法,能夠將JavaScript的Date 對象自動轉換成ISO 8601日期字符串(與在Date對象上調用toISOString() 的結果完全一樣)

 var date = JSON.stringify(new Date("2017-1-18")); console.log(date); // "2017-01-17T16:00:00.000Z"

toJSON()可以作為函數過濾器的補充,因此理解序列化的內部順序十分重要。假設把一個對象傳入JSON.stringify(),序列化該對象的順序如下

1、如果存在toJSON()方法而且能通過它取得有效的值,則調用該方法。否則,按默認順序執行序列化

2、如果提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第一步返回的值

3、對第二步返回的每個值進行相應的序列化

4、如果提供了第三個參數,執行相應的格式化

JSON.parse()     

JSON.parse()將JSON字符串解析為JavaScript值

var person = JSON.parse('{"name":"Lao Wang"}');console.log(person.name);// Lao Wang

注意:如果傳入的字符串不是有效的JSON格式,JSON.parse方法將報錯

JSON.parse()方法也可以接收另一個參數,該參數是一個函數,將在每個鍵值對兒上調用。為了區別 JSON.stringify()接收的替換(過濾)函數(replacer),這個函數被稱為還原函數(reviver),還原函數接收兩個參數,一個鍵和一個值,而且需要返回一個值

注意:如果還原函數返回 undefined,則表示要從結果中刪除相應的鍵;如果返回其他值,則將該值插入到結果中

var person = JSON.parse('{"name":"Lao Wang","age":21}',function(key,value){ if(key == "age"){ return undefined; }else{ return value; } }); console.log(person.name); // Lao Wang

在將日期字符串轉換為 Date 對象時,經常要用到還原函數

var book = { "title": "Professional JavaScript", "authors": ["Nicholas C. Zakas"], edition: 3, year: 2011, releaseDate: new Date(2017, 1, 18) }; var jsonText = JSON.stringify(book,null,4); console.log(jsonText); /* { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ], "edition": 3, "year": 2011, "releaseDate": "2017-02-17T16:00:00.000Z" } */ var bookCopy = JSON.parse(jsonText, function(key, value){ if (key == "releaseDate"){ return new Date(value); }else{ return value; } }); console.log(bookCopy.releaseDate.getFullYear());  // 2017

參考資料:

JSON對象 詳解及實例代碼

JavaScript高級程序設計中文版第三版

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲sss综合天堂久久| 亚洲女性裸体视频| 成人精品一区二区三区电影黑人| 亚洲男人天堂2019| 久久国内精品一国内精品| 欧美日韩国产精品一区二区三区四区| 国产精品成人一区| 亚洲综合国产精品| 久久精品中文字幕| 久久91超碰青草是什么| 亚洲a在线播放| 少妇高潮久久久久久潘金莲| 麻豆精品精华液| 国产日韩欧美黄色| 日本午夜人人精品| 在线精品播放av| 欧美日韩国产综合视频在线观看中文| 国产精品人成电影在线观看| 91精品视频免费| 欧美影院成年免费版| 狠狠久久五月精品中文字幕| 久热精品视频在线观看| 亚洲国产精品电影| 韩国精品美女www爽爽爽视频| 日韩一二三在线视频播| 亚洲性视频网站| 久久久国产精彩视频美女艺术照福利| 91精品国产91久久久久久| 日韩在线激情视频| 97高清免费视频| 日本久久久久久久久| 国产91在线播放精品91| 91精品国产高清自在线看超| 日韩一区二区精品视频| 中文字幕欧美日韩va免费视频| 狠狠色狠色综合曰曰| 欧美精品在线免费观看| 精品日韩视频在线观看| 亚洲欧美资源在线| 欧美精品免费播放| 欧美激情性做爰免费视频| 国产精品久久91| 亚洲天堂av综合网| 欧美性生交xxxxxdddd| 久久精品亚洲热| 精品成人国产在线观看男人呻吟| 青青青国产精品一区二区| 视频一区视频二区国产精品| 国产精品成久久久久三级| 亚洲色图校园春色| 成人444kkkk在线观看| 国产精品日韩专区| 精品久久久香蕉免费精品视频| 日韩精品福利在线| 欧美黑人又粗大| 久久频这里精品99香蕉| 亚洲精品欧美日韩专区| 日韩精品免费综合视频在线播放| 久久不射热爱视频精品| 欧美大尺度在线观看| 色婷婷**av毛片一区| 黑人狂躁日本妞一区二区三区| 日韩国产精品视频| 福利视频导航一区| 国模精品系列视频| 日韩在线视频线视频免费网站| 色噜噜亚洲精品中文字幕| 国内精品模特av私拍在线观看| 国产女精品视频网站免费| 成人网在线视频| 久久成人一区二区| 成人av.网址在线网站| 国产精品视频中文字幕91| 亚洲第一区中文99精品| 国产精品视频内| 91久久精品美女| 欧美在线视频a| 午夜欧美不卡精品aaaaa| 欧美性受xxxx黑人猛交| xvideos亚洲| 欧美激情一区二区三区在线视频观看| 成人午夜黄色影院| 久久久精品国产| 国产91网红主播在线观看| 精品久久中文字幕久久av| 国产欧美va欧美va香蕉在线| 色偷偷亚洲男人天堂| 亚洲欧美中文字幕| 成人性教育视频在线观看| 欧美电影免费播放| 国产欧美日韩高清| 欧美丝袜美女中出在线| 欧美成人在线免费| 91日本在线视频| 日韩精品在线播放| 欧美极品少妇xxxxx| 91色中文字幕| 色综合色综合久久综合频道88| 国产精品美女在线观看| 久久综合久久美利坚合众国| 国内精品伊人久久| 高清日韩电视剧大全免费播放在线观看| 欧美老妇交乱视频| 国产精品99久久久久久久久久久久| 亚洲欧美日韩中文在线| 美女扒开尿口让男人操亚洲视频网站| 亚洲国产精品小视频| 久久久久日韩精品久久久男男| 久久精品国产精品| 日韩经典第一页| 清纯唯美亚洲激情| 亚洲a中文字幕| 国产丝袜一区二区三区| 欧美视频在线视频| 国产欧美久久久久久| 91在线免费视频| 日韩在线一区二区三区免费视频| 日韩精品在线视频美女| 欧美午夜性色大片在线观看| 国产91免费看片| 68精品久久久久久欧美| 亚洲午夜精品久久久久久性色| 国产精品一区二区久久久| 欧美高清理论片| 亚洲国产精品专区久久| 国产欧美日韩91| 国产一区二区色| 精品国内产的精品视频在线观看| 日韩av在线看| 久久影视电视剧凤归四时歌| 欧美性猛交xxxx免费看漫画| 欧美成人午夜激情在线| 九九久久久久99精品| 国产精品成人观看视频国产奇米| 欧美日韩国产丝袜美女| 欧美精品在线极品| 欧美夫妻性视频| 国产做受高潮69| 国产成人一区二区三区| 国产97在线亚洲| 另类图片亚洲另类| 欧美性xxxx极品hd满灌| 精品国产一区二区三区久久狼黑人| 7777精品久久久久久| 日韩国产欧美精品一区二区三区| 国产亚洲xxx| 日韩中文字幕在线看| 91亚洲精品久久久久久久久久久久| 亚洲成人精品久久久| 欧美精品久久久久| 久久久久久久久久av| 45www国产精品网站| 亚洲曰本av电影| 国产脚交av在线一区二区| 欧美性生交xxxxx久久久| 色爱av美腿丝袜综合粉嫩av| 91精品国产综合久久香蕉的用户体验| 高清亚洲成在人网站天堂| 97香蕉超级碰碰久久免费软件| 91大神福利视频在线| 成人久久一区二区三区| 欧美日韩亚洲网| 免费不卡在线观看av| 亚洲码在线观看|