本文是 重溫基礎 系列文章的第十六篇。 今日感覺:靜。前端
系列目錄:git
本章節複習的是JS中的關於JSON對象相關知識。github
前置知識:
JSON
是一種按照JavaScript
對象語法的數據格式。編程
概念有三點:json
JSON
全稱JavaScript
對象表示法(JavaScript Object Notation)。
JSON
是存儲和交換文本信息的語法。相似XML
。
JSON
比XML
更小、更快,更易解析。
———— 摘自 W3school JSON教程數組
JSON
使用 JavaScript
語法來描述數據對象,可是 JSON
仍然獨立於語言和平臺。JSON
解析器和 JSON
庫支持許多不一樣的編程語言。微信
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 |
每日文章推薦 | github.com/pingan8787/… |
JS小冊 | js.pingan8787.com |
歡迎關注個人微信公衆號【前端自習課】