摘要:對(duì)象表示法,是一種數(shù)據(jù)交換格式,能夠在服務(wù)器端交換數(shù)據(jù),年由提出,目的是取代繁瑣笨重的格式。煦涵煦涵煦涵煦涵煦涵參考文檔感謝您的閱讀作者煦涵年月日下面是實(shí)驗(yàn)室的微信公眾號(hào)二維碼,歡迎長(zhǎng)按掃描關(guān)注
JSON(Javascript Object Notaion, javascript 對(duì)象表示法), 是一種數(shù)據(jù)交換格式,能夠在服務(wù)器端交換數(shù)據(jù), 2001年由Douglas Crockford提出,目的是取代繁瑣笨重的XML格式。
JSON 數(shù)據(jù)格式的優(yōu)點(diǎn):
與語(yǔ)言無(wú)關(guān)的文本數(shù)據(jù)格式
輕量、簡(jiǎn)單、易維護(hù)
是javascript編程語(yǔ)言的一個(gè)子集(Standard ECMA-262 3rd Edition - December 1999), 符合javascript 語(yǔ)言語(yǔ)法,可以使用javascript提供的方法直接解析處理
JSON 建立在兩種數(shù)據(jù)結(jié)構(gòu)上:
鍵 / 值對(duì):各種語(yǔ)言中可以為 字符串、對(duì)象、數(shù)組或者哈希表
有序列表(值):各種語(yǔ)言中實(shí)現(xiàn)為數(shù)組、向量、列表或者序列
JSON的基本語(yǔ)法:JSON 對(duì)象
{ "key": "value" }
JSON 數(shù)組
["value", "value", "value"]
value 可取值
可以是 String(必須使用雙引號(hào)包裹)、Number、Boolean、null、Object、Array, 這些形式可以嵌套,value值不能是八進(jìn)制、十六進(jìn)制(0xF0F)、undefined、function、日期對(duì)象,看下面示例:
合格的 JSON 格式:
{ "name": "煦涵", "name": null, "male": true, "age": 23 } { "brother": ["煦涵1", "煦涵2"] } { "brother": { "煦涵1": { "age": 32 }, "煦涵2": { "age": 30 } } } [{ "name": "煦涵" "age": 30 },{ "name": "張三" "age": 27 }]
不合格的 JSON 格式:
// key 必須用雙引號(hào)包裹,value 如果是字符串必須用雙引號(hào)包裹 { "name": "煦涵" } [1, 2, 3, 4, oxFOF] { "name": undefined } { "name": function() { return "煦涵" } } { "name": new Date() }
如果value的一個(gè)String(雙引號(hào)包圍)內(nèi)包含 "、、/、、f、
、
、 、u001f 需要使用反斜杠
如果value的一個(gè)Number,不能使用八進(jìn)制和十六進(jìn)制數(shù)值
PS: value對(duì)空格沒(méi)有限制要求
聊完 JSON 下面我們來(lái)聊聊 JSON 對(duì)象,javascript 在 ES5中新增了 JSON 對(duì)象,用來(lái)處理 JSON 文本數(shù)據(jù),實(shí)現(xiàn)字符串與 JSON 對(duì)象間的相互轉(zhuǎn)換,JSON.stringify ( value [ , replacer [ , space ] ] ) 和 JSON.parse ( text [ , reviver ] ), 前者是把 JSON 對(duì)象轉(zhuǎn)換為 JSON 字符串,后者的把 JSON 字符串解析為 JSON 對(duì)象,下面來(lái)詳細(xì)看看這個(gè)兩個(gè)方法。
JSON.stringify ( value [ , replacer [ , space ] ] )第一個(gè)參數(shù): Value 必須項(xiàng),可以是 Object, Array, String, Boolean, Number, Null.看幾個(gè)例子:
JSON.stringify({ "name": "煦涵", "age" : 28, "male" : true, "brother": [1, 2, 3], "parent": { "father" : { "name": "name" }, "mother": { "name": "name" } }, "other": null }) // result "{"name":"煦涵","age":28,"male":true,"brother":["B1","B2","B3"],"parent":{"father":{"name":"name"},"mother":{"name":"name"}},"other":null}"
當(dāng)待轉(zhuǎn)換值不是 JSON 的基本類型時(shí):
原始對(duì)象 item 值是 undefined、函數(shù)或 XML 對(duì)象,值會(huì)被過(guò)濾;
數(shù)組 item 是 undefined、函數(shù)或 XML 對(duì)象,值會(huì)被轉(zhuǎn)成 null;
正則對(duì)象會(huì)被轉(zhuǎn)換成空對(duì)象;
對(duì)象的不可遍歷屬性會(huì)被忽略;
八進(jìn)制和十六進(jìn)制會(huì)被轉(zhuǎn)換成十進(jìn)制;
特殊字符需要轉(zhuǎn)義成反斜杠
JSON.stringify({ "name": undefined, "age" : function() {return 28}, "male" : /male/g, "brother": [undefined, function() {return abc}, "B3", 0xFOF], "parent": { "father" : { "name": undefined }, "mother": { "name": "name" } }, "other": null }) // result: 正則被轉(zhuǎn)出了空對(duì)象,undefined, function 被忽略或者轉(zhuǎn)成 null "{"male":{},"brother":[null,null,"B3", 3855],"parent":{"father":{},"mother":{"name":"name"}},"other":null}" /* 不可遍歷屬性 */ var demo = {}; Object.defineProperties(demo, { "name": { value: "煦涵", enumerable: false }, "age": { value: 28, enumerable: true } }) JSON.stringify(demo); // enumerable: 當(dāng)且僅當(dāng)該屬性的 enumerable 為 true 時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中, // result: name 屬性會(huì)被過(guò)濾 "{"age":28}" /* 特殊字符處理-01 */ JSON.stringify({ "special01": "回車 ,換行 ,退格 ,換頁(yè) f,Tab ", "special02": "雙引號(hào) ",單引號(hào) ", 斜杠 /, 反斜杠 ", "special03": "unicdoe字符 u001f" }) // result "{"special01":"回車 ,換行 ,退格 ,換頁(yè) f,Tab ","special02":"雙引號(hào) ",單引號(hào) ", 斜杠 /, 反斜杠 ","special03":"unicdoe字符 u001f"}" /* 特殊字符處理-02 */ var demo = {} demo.special01 = "回車 ,換行 ,退格 ,換頁(yè) f,Tab "; demo.special02 = "雙引號(hào) ",斜杠 /, 反斜杠,end "; demo.special03 = "unicdoe字符 u001f"; JSON.stringify(demo); // result, 雙引號(hào)被轉(zhuǎn)義了,反斜杠被忽略了 "{"special01":"回車 ,換行 ,退格 ,換頁(yè) f,Tab ","special02":"雙引號(hào) ",斜杠 /, 反斜杠,end ","special03":"unicdoe字符 u001f"}"
第二個(gè)參數(shù):replacer可選項(xiàng),可以是 array or function
當(dāng)replacer 是數(shù)組時(shí),對(duì)第一個(gè)參數(shù) value進(jìn)行過(guò)濾,key 不在數(shù)組里的不會(huì)輸出,這里需要注意的是,當(dāng)?shù)谝粋€(gè)參數(shù)為Object時(shí)才有效,如果為Array,無(wú)效,看下面例子:
當(dāng)replacer 是函數(shù)時(shí),遞歸遍歷所有的鍵,可以對(duì)對(duì)象進(jìn)行format and replace 等操作
/* replacer 為數(shù)組 */ JSON.stringify({ "0": "安徽省", "1": "蚌埠市", "2": "固鎮(zhèn)縣" }, [0,1]) // result: "{"0":"安徽省","1":"蚌埠市"}" JSON.stringify([ "安徽省", "蚌埠市", "固鎮(zhèn)縣" ], [0,1]) // result "["安徽省","蚌埠市","固鎮(zhèn)縣"]" /* replacer 為函數(shù) */ JSON.stringify({ "0": "安徽省", "1": "蚌埠市", "2": "固鎮(zhèn)縣" }, function(key, value) { // key: "", value: {0: "安徽省", 1: "蚌埠市", 2: "固鎮(zhèn)縣"} console.log(key, value); return value[0] + value[1] + value[2]; }) // result ""安徽省蚌埠市固鎮(zhèn)縣""
第三個(gè)參數(shù):space 可選項(xiàng),用于增加format字符的可讀性,可取值 Number, String, 但長(zhǎng)度不超過(guò)10個(gè)字符
JSON.stringify({"name": "煦涵", "age": 28, "male": true, "other": null}, "", 4) // result "{ "name": "煦涵", "age": 28, "male": true, "other": null }" JSON.stringify({"level1": {"level2": {"level3": {"name": "煦涵"} } } }, "", "|---") // result: 展示屬性結(jié)構(gòu)很直觀 "{ |---"level1": { |---|---"level2": { |---|---|---"level3": { |---|---|---|---"name": "煦涵" |---|---|---} |---|---} |---} }"
特殊情況
還記得上面的幾種情況吧,當(dāng)對(duì)象不是原始對(duì)象時(shí),處理方式有所不同,比如正則表達(dá)式時(shí),會(huì)返回空對(duì)象,日期對(duì)象時(shí)返回日期字符串;參看文檔是,JSON.stringify發(fā)現(xiàn)參數(shù)對(duì)象有toJSON方法,就直接使用這個(gè)方法的返回值作為參數(shù),而忽略原對(duì)象的其他參數(shù)。
JSON.stringify({ "name": "煦涵", "age": 28, "toJSON": function() { return this.name + "年齡是" + this.age + "歲" } }) // result: ""煦涵年齡是28歲"" /* 日期對(duì)象Date原型上包含toJSON 方法,`Date.prototype.toJSON ( key )` */ var date = new Date(); date.toJSON(); JSON.stringify(date); /* RegExp 對(duì)象 JSON.stringify 默認(rèn)會(huì)把正則轉(zhuǎn)換成空對(duì)象,我們可以使用toJSON, 把正則表達(dá)式轉(zhuǎn)換成字符串 */ RegExp.prototype.toJSON = RegExp.prototype.toString; JSON.stringify(/abc/g) // result ""/abc/g""JSON.parse ( text [ , reviver ] )
JSON.parse為 JSON.stringify的逆運(yùn)算,轉(zhuǎn)換時(shí) text 必須符合JSON的語(yǔ)法格式, 不然會(huì)報(bào)錯(cuò),reviver 參數(shù) 和 JSON.stringify 的參數(shù) replacer類似, 但是遍歷順序和replacer相反。
JSON.parse("{"name":"煦涵","age":28,"male":true,"brother":["B1","B2","B3"],"parent":{"father":{"name":"name"},"mother":{"name":"name"}},"other":null}" ) /* result: { "name": "煦涵", "age" : 28, "male" : true, "brother": ["B1", "B2", "B3"], "parent": { "father" : { "name": "name" }, "mother": { "name": "name" } }, "other": null } */ JSON.parse("{"level1": {"level2": {"name": "煦涵"} } }", function(key, value) { // level2 Object {name: "煦涵"} // level1 Object {level2: Object} // Object {level1: Object} console.log(key, value); return value; }) // result {"level1":{"level2":{"name":"煦涵"}}}參考文檔:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.12
https://github.com/douglascrockford/JSON-js/blob/master/json2.js
http://www.json.org/
感謝您的閱讀
--eof--
作者[煦涵]
2017年04月30日
下面是「FED實(shí)驗(yàn)室」的微信公眾號(hào)二維碼,歡迎長(zhǎng)按、掃描關(guān)注:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83220.html
摘要:,下一代編譯器,當(dāng)前版本,它可以處理的所有新語(yǔ)法,并內(nèi)置了擴(kuò)展及類型注解支持,如果對(duì)不是很了解可以查看實(shí)驗(yàn)室微信公眾號(hào)文章煦涵說(shuō)。 Babel,下一代javascript編譯器,當(dāng)前版本 v2.4.0 ,它可以處理ES6的所有新語(yǔ)法,并內(nèi)置了React JSX擴(kuò)展及Flow類型注解支持,如果對(duì)Flow不是很了解可以查看FED實(shí)驗(yàn)室微信公眾號(hào)文章煦涵說(shuō)Flow。 Babel與JavaSc...
摘要:現(xiàn)在已經(jīng)在前端比較流行的等框架中得到使用。今天煦涵就和大家一起來(lái)學(xué)習(xí)以及在實(shí)際項(xiàng)目中的使用。安裝這里我們選擇使用,當(dāng)前你也可以使用如果你對(duì)不是很了解,建議你閱讀煦涵說(shuō)。 Flow是Facebook出品的一個(gè)JavaScript代碼的靜態(tài)類型檢查工具,它做了很多處理,使您的代碼更快,更智能,更自信,更好的適應(yīng)性。現(xiàn)在已經(jīng)在前端比較流行的React 、Vue 等框架中得到使用。今天煦涵就和...
摘要:是一個(gè)新的包管理器,它由開(kāi)發(fā)者共同開(kāi)發(fā)完成。從包管理器中借鑒,創(chuàng)建了文件,用來(lái)記錄項(xiàng)目使用每個(gè)包的確切版本。感謝您的閱讀作者煦涵年月日下面是實(shí)驗(yàn)室的微信公眾號(hào)二維碼,歡迎長(zhǎng)按掃描關(guān)注 Yarn是一個(gè)新的Javascript包管理器,它由Facebook, Google, Exponent and Tilde開(kāi)發(fā)者共同開(kāi)發(fā)完成。Yarn 不是 NPM 的fork版本,而是它的重新設(shè)計(jì),Y...
摘要:,是一個(gè)前端資源加載打包工具,現(xiàn)在版本已經(jīng)到,今天的文章不支持介紹的及使用,而是對(duì)最近項(xiàng)目開(kāi)發(fā)中使用打包時(shí)處理低版本及以下瀏覽器兼容問(wèn)題做一次總結(jié)。 Webpack,Webpack 是一個(gè)前端資源加載/打包工具,現(xiàn)在版本已經(jīng) release 到 v2.6.1,今天的文章不支持介紹Webpack的API及使用,而是對(duì)最近項(xiàng)目開(kāi)發(fā)中使用Webpack打包時(shí)處理IE低版本(IE8及以下)瀏覽...
摘要:什么是對(duì)象簡(jiǎn)譜是一種輕量級(jí)的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。 什么是Json? Json(JavaScript Object Notation,JS 對(duì)象簡(jiǎn)譜)是一種輕量級(jí)的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。一些合法的Json實(shí)例:鍵值對(duì):(可以沒(méi)有鍵只有值)鍵 ...
閱讀 3086·2021-11-22 09:34
閱讀 2537·2021-09-30 09:47
閱讀 1472·2021-09-03 10:32
閱讀 3764·2021-08-16 10:49
閱讀 1814·2019-08-30 15:55
閱讀 2500·2019-08-30 15:52
閱讀 3354·2019-08-30 15:44
閱讀 1383·2019-08-30 15:44