摘要:對象表示法,是一種數(shù)據(jù)交換格式,能夠在服務(wù)器端交換數(shù)據(jù),年由提出,目的是取代繁瑣笨重的格式。煦涵煦涵煦涵煦涵煦涵參考文檔感謝您的閱讀作者煦涵年月日下面是實(shí)驗(yàn)室的微信公眾號二維碼,歡迎長按掃描關(guān)注
JSON(Javascript Object Notaion, javascript 對象表示法), 是一種數(shù)據(jù)交換格式,能夠在服務(wù)器端交換數(shù)據(jù), 2001年由Douglas Crockford提出,目的是取代繁瑣笨重的XML格式。
JSON 數(shù)據(jù)格式的優(yōu)點(diǎn):
與語言無關(guān)的文本數(shù)據(jù)格式
輕量、簡單、易維護(hù)
是javascript編程語言的一個子集(Standard ECMA-262 3rd Edition - December 1999), 符合javascript 語言語法,可以使用javascript提供的方法直接解析處理
JSON 建立在兩種數(shù)據(jù)結(jié)構(gòu)上:
鍵 / 值對:各種語言中可以為 字符串、對象、數(shù)組或者哈希表
有序列表(值):各種語言中實(shí)現(xiàn)為數(shù)組、向量、列表或者序列
JSON的基本語法:JSON 對象
{ "key": "value" }
JSON 數(shù)組
["value", "value", "value"]
value 可取值
可以是 String(必須使用雙引號包裹)、Number、Boolean、null、Object、Array, 這些形式可以嵌套,value值不能是八進(jìn)制、十六進(jìn)制(0xF0F)、undefined、function、日期對象,看下面示例:
合格的 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 必須用雙引號包裹,value 如果是字符串必須用雙引號包裹 { "name": "煦涵" } [1, 2, 3, 4, oxFOF] { "name": undefined } { "name": function() { return "煦涵" } } { "name": new Date() }
如果value的一個String(雙引號包圍)內(nèi)包含 "、、/、、f、
、
、 、u001f 需要使用反斜杠
如果value的一個Number,不能使用八進(jìn)制和十六進(jìn)制數(shù)值
PS: value對空格沒有限制要求
聊完 JSON 下面我們來聊聊 JSON 對象,javascript 在 ES5中新增了 JSON 對象,用來處理 JSON 文本數(shù)據(jù),實(shí)現(xiàn)字符串與 JSON 對象間的相互轉(zhuǎn)換,JSON.stringify ( value [ , replacer [ , space ] ] ) 和 JSON.parse ( text [ , reviver ] ), 前者是把 JSON 對象轉(zhuǎn)換為 JSON 字符串,后者的把 JSON 字符串解析為 JSON 對象,下面來詳細(xì)看看這個兩個方法。
JSON.stringify ( value [ , replacer [ , space ] ] )第一個參數(shù): Value 必須項(xiàng),可以是 Object, Array, String, Boolean, Number, Null.看幾個例子:
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 的基本類型時:
原始對象 item 值是 undefined、函數(shù)或 XML 對象,值會被過濾;
數(shù)組 item 是 undefined、函數(shù)或 XML 對象,值會被轉(zhuǎn)成 null;
正則對象會被轉(zhuǎn)換成空對象;
對象的不可遍歷屬性會被忽略;
八進(jìn)制和十六進(jìn)制會被轉(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)出了空對象,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 時,該屬性才能夠出現(xiàn)在對象的枚舉屬性中, // result: name 屬性會被過濾 "{"age":28}" /* 特殊字符處理-01 */ JSON.stringify({ "special01": "回車 ,換行 ,退格 ,換頁 f,Tab ", "special02": "雙引號 ",單引號 ", 斜杠 /, 反斜杠 ", "special03": "unicdoe字符 u001f" }) // result "{"special01":"回車 ,換行 ,退格 ,換頁 f,Tab ","special02":"雙引號 ",單引號 ", 斜杠 /, 反斜杠 ","special03":"unicdoe字符 u001f"}" /* 特殊字符處理-02 */ var demo = {} demo.special01 = "回車 ,換行 ,退格 ,換頁 f,Tab "; demo.special02 = "雙引號 ",斜杠 /, 反斜杠,end "; demo.special03 = "unicdoe字符 u001f"; JSON.stringify(demo); // result, 雙引號被轉(zhuǎn)義了,反斜杠被忽略了 "{"special01":"回車 ,換行 ,退格 ,換頁 f,Tab ","special02":"雙引號 ",斜杠 /, 反斜杠,end ","special03":"unicdoe字符 u001f"}"
第二個參數(shù):replacer可選項(xiàng),可以是 array or function
當(dāng)replacer 是數(shù)組時,對第一個參數(shù) value進(jìn)行過濾,key 不在數(shù)組里的不會輸出,這里需要注意的是,當(dāng)?shù)谝粋€參數(shù)為Object時才有效,如果為Array,無效,看下面例子:
當(dāng)replacer 是函數(shù)時,遞歸遍歷所有的鍵,可以對對象進(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)縣""
第三個參數(shù):space 可選項(xiàng),用于增加format字符的可讀性,可取值 Number, String, 但長度不超過10個字符
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)對象不是原始對象時,處理方式有所不同,比如正則表達(dá)式時,會返回空對象,日期對象時返回日期字符串;參看文檔是,JSON.stringify發(fā)現(xiàn)參數(shù)對象有toJSON方法,就直接使用這個方法的返回值作為參數(shù),而忽略原對象的其他參數(shù)。
JSON.stringify({ "name": "煦涵", "age": 28, "toJSON": function() { return this.name + "年齡是" + this.age + "歲" } }) // result: ""煦涵年齡是28歲"" /* 日期對象Date原型上包含toJSON 方法,`Date.prototype.toJSON ( key )` */ var date = new Date(); date.toJSON(); JSON.stringify(date); /* RegExp 對象 JSON.stringify 默認(rèn)會把正則轉(zhuǎn)換成空對象,我們可以使用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)換時 text 必須符合JSON的語法格式, 不然會報錯,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)室」的微信公眾號二維碼,歡迎長按、掃描關(guān)注:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83220.html
摘要:,是一個前端資源加載打包工具,現(xiàn)在版本已經(jīng)到,今天的文章不支持介紹的及使用,而是對最近項(xiàng)目開發(fā)中使用打包時處理低版本及以下瀏覽器兼容問題做一次總結(jié)。 Webpack,Webpack 是一個前端資源加載/打包工具,現(xiàn)在版本已經(jīng) release 到 v2.6.1,今天的文章不支持介紹Webpack的API及使用,而是對最近項(xiàng)目開發(fā)中使用Webpack打包時處理IE低版本(IE8及以下)瀏覽...
摘要:什么是對象簡譜是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機(jī)器解析和生成。 什么是Json? Json(JavaScript Object Notation,JS 對象簡譜)是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機(jī)器解析和生成。一些合法的Json實(shí)例:鍵值對:(可以沒有鍵只有值)鍵 ...
閱讀 3044·2021-11-22 09:34
閱讀 2516·2021-09-30 09:47
閱讀 1448·2021-09-03 10:32
閱讀 3720·2021-08-16 10:49
閱讀 1794·2019-08-30 15:55
閱讀 2465·2019-08-30 15:52
閱讀 3325·2019-08-30 15:44
閱讀 1359·2019-08-30 15:44