本文是 重溫基礎 系列文章的第十六篇。
今日感覺:靜。 前端
系列目錄:git
本章節複習的是JS中的關於JSON對象相關知識。 github
前置知識: JSON
是一種按照JavaScript
對象語法的數據格式。編程
概念有三點:json
JSON
全稱JavaScript
對象表示法(JavaScript Object Notation)。
JSON
是 存儲和 交換文本信息的語法。相似XML
。
JSON
比XML
更小、更快,更易解析。
———— 摘自 W3school JSON教程
JSON
使用 JavaScript
語法來描述數據對象,可是 JSON
仍然獨立於語言和平臺。JSON
解析器和 JSON
庫支持許多不一樣的編程語言。segmentfault
JSON
在使用過程當中可做爲一個對象或者字符串存在,看成爲對象時,用於獲取JSON
中的數據,而做爲字符串時經常使用於網絡數據傳輸。 數組
JSON
語法規則:微信
一般,JSON
數據書寫格式是名稱/鍵值
:網絡
"name" : "pingan"
而JSON
的值能夠是 :編程語言
true
或 false
)null
JSON經常有三種類型:
三種類型:簡單之,對象和數組。
必須注意:JSON字符串必須是雙引號,單引號會語法錯誤。
簡單值能夠是字符串:
"hello leo!"
也能夠是數字,邏輯值:
1
內容放在花括號
內,是多個鍵值對。
JSON對象 與 js 對象的三個區別:
// js 對象 var obj = { name : "pingan", age : "25", }; // json 對象 { "name" : "pingan", "age" : "25", "box" : [ "a","b","c" ] }
內容放在方括號
內。
JSON數組也沒有分號和變量,經常能夠把JSON數組和對象結合使用,構成更復雜的數據集合。
[ { "name" : "leo", "age" : 25, "box" : ["a","b","c"] }, { "name" : "pingan", "age" : 25, "box" : ["a","b","c"] } ]
JSON最多見的用法就是,從服務端獲取JSON數據,再將JSON數據轉成JavaScrip對象使用。
JSON對象有兩個方法:
JSON.stringify()
: 序列化操做,將JavaScript對象
轉換成JSON字符串
。JSON.prase()
:反序列化操做,將JSON字符串
解析成JavaScript值
。序列化操做經常使用JSON.stringify()
。
簡單例子:
let leo = { name : "leo", age : 25, box : ["a","b","c"] } let pingan = JSON.stringify(leo); console.log(pingan); // "{"name":"leo","age":25,"box":["a","b","c"]}"
注意:
JSON.stringify()
輸出的JSON字符串不包含任何空格字符或縮進,所以結果就像上面那樣。JavaScript對象
時,全部函數及原型成員都會被忽略,不體如今結果上。undefined
的任何屬性都會被跳過。所以,最終的值都是有效的JSON數據類型的實例屬性。
序列化操做經常使用JSON.parse()
。
簡單例子:
let copyPingan = JSON.parse(pingan); copyPingan; // {name: "leo", age: 25, box: Array(3)}
若是傳入JSON.parse()
的字符串不是有效的JSON,則會拋出錯誤。
注意:
雖然pingan
和copyPingan
屬性相同,但二者獨立,沒有任何關係。
JSON.stringify()
除了要傳入序列化對象做爲參數,還能夠接收其餘兩個參數,用來指定序列化JavaScript對象的方式:
JSON字符串
中保留縮進。單獨或組合使用二者,能夠更加全面深刻的控制JSON的序列化。
若過濾器的參數是數組,則JSON.stringify()
返回的結果將只包含數組中的屬性:
var leo = { name : "leo", age : 25, box : ["a","b","c"] } var pingan = JSON.stringify(leo,["name","age"]); console.log(pingan); // "{"name":"leo","age":25}"
若過濾器的參數是函數,則狀況就不同了,傳入的函數需有兩個參數(屬性名和屬性值):
var leo = { "name" : "leo", "age" : 25, "box" : ["a","b","c"] } var pingan = JSON.stringify(leo,function(key, value){ switch(key){ case "name": return "我叫" + value case "age": return value + "歲" default: return value } }); console.log(pingan); // "{"name":"我叫leo","age":"25歲","box":["a","b","c"]}"
注意:使用switch
的時候,必須指定default
不然會返回undefined
。
JSON.stringify()
第三個參數是個選項,控制結果中的縮進和空白符。
10
,超過10
則只會是10
。var leo = { "name" : "leo", "age" : 25, "box" : ["a","b","c"] } var pingan = JSON.stringify(leo, null, 4); console.log(pingan); /* "{ "name": "leo", "age": 25, "box": [ "a", "b", "c" ] }" */
JSON.parse()
能夠接收一個函數做爲參數,對每一個鍵值對調用,爲了跟JSON.stringify()
的過濾函數
區別,這個函數成爲還原函數
。
undefined
,則表示要從結果中刪除對應的鍵。還原函數接收兩個參數:屬性名和屬性值。
舉例,在日期字符串轉換爲Date對象中,常常要用到還原函數:
var leo = { "name" : "leo", "age" : 25, "date" : new Date(1993, 9, 9) } var pingan = JSON.stringify(leo); var copy = JSON.parse(pingan,function (key, value){ // return key == "date" ? new Date(value) : value; if(key == "date"){ return new Date(value); }else{ return value; } }) console.log(copy); // "{"name":"leo","age":25,"date":"1993-10-08T16:00:00.000Z"}"
本部份內容到這結束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推薦 | https://github.com/pingan8787... |
JS小冊 | js.pingan8787.com |
歡迎關注微信公衆號【前端自習課】天天早晨,與您一塊兒學習一篇優秀的前端技術博文 .