摘要:全稱為對象表示法,它利用與對象相似的表示方法來表示數(shù)據(jù)。但是要注意的是不能表示當(dāng)中的一種特殊值。對象,與對象相似,表示無序的鍵值對。但是由于存在安全的風(fēng)險(xiǎn),因此在開始有了一個(gè)新的全局對象對象用來處理。輸出的字符串會(huì)受到該函數(shù)的返回值影響。
JSON 全稱為 JavaScript Object Notation(JavaScript對象表示法),它利用與 JavaScript 對象相似的表示方法來表示數(shù)據(jù)。雖然 JSON 脫胎于 JavaScript,但是 JSON 并不屬于 JavaScript 的一部分,很多的語言都可以解析和序列化 JSON。
JSON 語法JSON 可以表示以下三種類型的值:
簡單值
對象
數(shù)組
簡單值包括字符串、數(shù)值、布爾值和 null。但是要注意的是 JSON 不能表示 JavaScript 當(dāng)中的一種特殊值 undefinde。
對象,與 JavaScript對象相似,表示無序的鍵值對。鍵值對中的值可以是簡單值,也可以是對象或數(shù)組。
數(shù)組,與 JavaScript數(shù)組相似,表示一組有序的值,數(shù)組的值可以是簡單值,也可以是對象或數(shù)組。
舉個(gè)例子:
{ "name": "acwong", "age": 23, "address": { "province": "GuangDong", "city": "GuangZhou" }, "friends": ["bc", "cc", "dc"], "blog": "http://acwong.org" }
需要注意的是,也是與 JavaScript對象表示方法的不同之處,JSON 字符串當(dāng)中對象的屬性必須加上雙引號。
// 正確示范 { "name": "acwong" } // 錯(cuò)誤示范 { name: "acwong" } // 單引號也是錯(cuò)誤的 { "name": "acwong" }JavaScript 與 JSON JSON 對象
在 JSON 誕生之初 JavaScript 處理 JSON 的方式基本就靠 eval() 函數(shù)。
eval() 函數(shù)可以解析 JSON 然后返回 JavaScript 數(shù)組。但是由于 eval() 存在安全的風(fēng)險(xiǎn),因此在 EMCAScript 5 開始有了一個(gè)新的全局對象 JSON對象用來處理 JSON。
序列化 JSONJavaScript 使用 JSON對象的 stringify() 方法來序列化 JSON。
var person = { name: "acwong", age: 23, address: { province: "GuangDong", city: "GuangZhou" }, friends: ["bc", "cc", "dc"], blog: "http://acwong.org" }; var jsonText = JSON.stringify(person); console.log(jsonText); // {"name":"acwong","age":23,"address":{"province":"GuangDong","city":"GuangZhou"},"friends":["bc","cc","dc"],"blog":"http://acwong.org"}
JSON.stringify() 方法在默認(rèn)情況下輸出的 JSON字符串不包含空格字符和縮進(jìn)。
如果 JavaScript對象當(dāng)中包含不被 JSON 支持的類型(如:undefined,函數(shù))會(huì)自動(dòng)被 stringigy() 方法忽略。
var person = { name: "acwong", blog: undefined, todo: function() { return "sleep"; } }; var jsonText = JSON.stringify(person); console.log(jsonText); // {"name":"acwong"}
JSON.stringify() 方法包含三個(gè)參數(shù),第一個(gè)參數(shù)就是要序列化的 JavaScript對象。第二個(gè)參數(shù)完成過濾輸出結(jié)果功能。第三個(gè)參數(shù)控制輸出字符串的縮進(jìn)。
過濾輸出結(jié)果第二個(gè)參數(shù)完成過濾輸出結(jié)果功能。
當(dāng)傳入的第二個(gè)參數(shù)為數(shù)組時(shí),輸出的 JSON字符串只會(huì)保留包含在該數(shù)組里面的屬性值。
var person = { name: "acwong", age: 23, address: { province: "GuangDong", city: "GuangZhou" }, friends: ["bc", "cc", "dc"], blog: "http://acwong.org" }; var jsonText = JSON.stringify(person, ["name","blog"]); console.log(jsonText); // {"name":"acwong","blog":"http://acwong.org"}
當(dāng)傳入的第二個(gè)參數(shù)為函數(shù),該函數(shù)包含兩個(gè)參數(shù),分別是 JavaScript對象的屬性名和屬性值。輸出的 JSON字符串會(huì)受到該函數(shù)的返回值影響。
// 省略 person對象 var jsonText = JSON.stringify(person, function(key, value) { if (key === "name") { return "ac"; } else if (key === "age") { value++; return value; } else { return value; } }); console.log(jsonText); // {"name":"ac","age":24,"address":{"province":"GuangDong","city":"GuangZhou"},"friends":["bc","cc","dc"],"blog":"http://acwong.org"}控制縮進(jìn)
第三個(gè)參數(shù)控制輸出字符串的縮進(jìn)。
當(dāng)?shù)谌齻€(gè)參數(shù)傳入一個(gè)數(shù)值的時(shí)候,表示輸出字符串縮進(jìn)的空格數(shù)。
// 省略 person對象 var jsonText = JSON.stringify(person, null, 2); console.log(jsonText);
// 輸出 { "name": "acwong", "age": 23, "address": { "province": "GuangDong", "city": "GuangZhou" }, "friends": [ "bc", "cc", "dc" ], "blog": "http://acwong.org" }
當(dāng)?shù)谌齻€(gè)參數(shù)傳入一個(gè)字符串時(shí),輸出結(jié)果會(huì)以該字符串作為縮進(jìn)符號。
// 省略 person對象 // 使用 * 號縮進(jìn) var jsonText = JSON.stringify(person, null, "*"); console.log(jsonText);
// 輸出 { *"name": "acwong", *"age": 23, *"address": { **"province": "GuangDong", **"city": "GuangZhou" *}, *"friends": [ **"bc", **"cc", **"dc" *], *"blog": "http://acwong.org" }
// 省略 person對象 // 使用制表符(Tab)縮進(jìn) var jsonText = JSON.stringify(person, null, " "); console.log(jsonText);
// 輸出 { "name": "acwong", "age": 23, "address": { "province": "GuangDong", "city": "GuangZhou" }, "friends": [ "bc", "cc", "dc" ], "blog": "http://acwong.org" }自定義序列化
如果上述的方法都不能滿足要求,還可以在要序列化的 JavaScript對象當(dāng)中加入 toJSON() 函數(shù),可以返回任何想返回的值。
var person = { name: "acwong", age: 23, address: { province: "GuangDong", city: "GuangZhou" }, friends: ["bc", "cc", "dc"], blog: "http://acwong.org", toJSON: function() { this.name = "ac"; return "yoyo " + this.name; } }; var jsonText = JSON.stringify(person); console.log(jsonText); // "yoyo ac"解析 JSON
JavaScript 使用 JSON對象的 parse() 方法來解析 JSON。
var jsonText = "{"name":"acwong","age":23,"address":{"province":"GuangDong","city":"GuangZhou"},"friends":["bc","cc","dc"],"blog":"http://acwong.org"}"; var person = JSON.parse(jsonText); console.log(person);
JSON.parse() 同樣可以傳入一個(gè)函數(shù)作為參數(shù),對鍵值對進(jìn)行操作。
var jsonText = "{"name":"acwong","age":23,"blog":"http://acwong.org"}"; var person = JSON.parse(jsonText); console.log(person);JSON 的好處
與 XML 一樣可以表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
比 XML 輕量得多。
語法簡單易懂。
由于其輕量級,在傳輸?shù)臅r(shí)候占用的資源相對較少。
感謝您的閱讀,有不足之處請為我指出。
參考
JavaScript高級程序設(shè)計(jì)(第3版)
本文同步于我的個(gè)人博客 http://blog.acwong.org/2015/03/05/json-notes/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/91487.html
摘要:與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換僅作為一個(gè)學(xué)習(xí)筆記供往后翻閱轉(zhuǎn)為數(shù)組轉(zhuǎn)為數(shù)組最方便的方法,就是使用擴(kuò)展運(yùn)算符。對象轉(zhuǎn)為轉(zhuǎn)為轉(zhuǎn)為要區(qū)分兩種情況。轉(zhuǎn)為轉(zhuǎn)為,正常情況下,所有鍵名都是字符串。這往往是數(shù)組轉(zhuǎn)為的逆操作。 Map 與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換 PS:僅作為一個(gè)學(xué)習(xí)筆記供往后翻閱! (1)Map 轉(zhuǎn)為數(shù)組Map 轉(zhuǎn)為數(shù)組最方便的方法,就是使用擴(kuò)展運(yùn)算符(...)。 const myMap = ...
摘要:關(guān)于對象定義了全局對象。支持的瀏覽器有除了接受要序列化的對象外,還可以接受另外兩個(gè)參數(shù)。如果是數(shù)值,則表示每個(gè)級別縮進(jìn)的空格數(shù),最大,超過的值自動(dòng)轉(zhuǎn)換成。字符串長度超過,結(jié)果中將只出現(xiàn)前個(gè)字符。會(huì)在結(jié)果字符串中插入換行符提高可讀性。 關(guān)于JSON 1. JSON 對象 es5 定義了全局對象 JSON。支持的瀏覽器有 IE8+ 、Firefox 3.5+ 、Safari 4+、Chro...
摘要:一什么是為什么使用是機(jī)制的一種替代方案。這種情況下使用就會(huì)有更加方便。的數(shù)據(jù)結(jié)構(gòu)一般為三部分組成頭部一般包含簽名的算法和令牌的屬性負(fù)載實(shí)際需要傳遞的數(shù)據(jù)一般不加密,因此不要把重要信息放在里面簽名部分是對前兩部分的簽名,防止數(shù)據(jù)篡改。 一、什么是JSON Web Token? 1、為什么使用JSON Web Token JSON Web Token是cookie session機(jī)制的一種...
先學(xué)習(xí)阮大神的 數(shù)據(jù)類型和Json格式 一、js中解析JSON的方式 eval() JSON.parse var jsondata = {staff:[{name:小紅,age:16},{name:小明,age:20},{name:小芳,age:18}]} var jsonobj = eval(( + jsondata + )) alert( jsonobj.staff[0].name); s...
摘要:背景這幾天調(diào)到后臺(tái)組,搞后臺(tái)開發(fā),開發(fā)中碰到頁面拼裝到后臺(tái)的如下所示多選的數(shù)據(jù)是數(shù)組的方式,手動(dòng)將數(shù)組轉(zhuǎn)換成串又嫌麻煩,后來發(fā)現(xiàn)這一神器,只需要一行代碼,就能把數(shù)組轉(zhuǎn)成。 本文僅作為個(gè)人學(xué)習(xí)總結(jié)記錄使用!能力有限,難免會(huì)有疏漏和錯(cuò)誤,還望指出。共同進(jìn)步。 背景 這幾天調(diào)到后臺(tái)組,搞web后臺(tái)開發(fā),開發(fā)中碰到頁面拼裝JSON到后臺(tái)的CASE 如下所示:showImg(http://se...
閱讀 4984·2021-11-25 09:43
閱讀 1685·2021-10-27 14:18
閱讀 1057·2021-09-22 16:03
閱讀 1349·2019-08-30 13:19
閱讀 1572·2019-08-30 11:15
閱讀 1645·2019-08-26 14:04
閱讀 3124·2019-08-23 18:40
閱讀 1166·2019-08-23 18:17