本文是 重溫基礎 系列文章的第十六篇。今日感受:靜。
系列目錄:
本章節複習的是JS中的關於JSON物件相關知識。
前置知識:JSON
是一種按照JavaScript
物件語法的資料格式。
1.概念
概念有三點:
JSON
全稱JavaScript
物件表示法(JavaScript Object Notation)。JSON
是儲存和交換文字資訊的語法。類似XML
。JSON
比XML
更小、更快,更易解析。
———— 摘自 W3school JSON教程
JSON
使用 JavaScript
語法來描述資料物件,但是 JSON
仍然獨立於語言和平臺。JSON
解析器和 JSON
庫支援許多不同的程式語言。
2.語法
JSON
在使用過程中可作為一個物件或者字串存在,當作為物件時,用於獲取JSON
中的資料,而作為字串時常用於網路資料傳輸。
JSON
語法規則:
- 資料在名稱/值對中
- 資料由逗號分隔
- 花括號儲存物件
- 方括號儲存陣列
通常,JSON
資料書寫格式是名稱/鍵值
:
"name" : "pingan"複製程式碼
而JSON
的值可以是 :
- 數字(整數或浮點數)
- 字串(在雙引號中)
- 邏輯值(
true
或false
) - 陣列(在方括號中)
- 物件(在花括號中)
null
JSON常常有三種型別:
三種型別:簡單值,物件和陣列。
必須注意:JSON字串必須是雙引號,單引號會語法錯誤。
2.1 簡單值
簡單值可以是字串:
"hello leo!"複製程式碼
也可以是數字,邏輯值:
1複製程式碼
2.2 物件型別
內容放在花括號
內,是多個鍵值對。
JSON物件 與 js 物件的三個區別:
- JSON物件 必須加雙引號,而 js 物件屬性名可以不加雙引號。
- JSON物件 沒有變數宣告,而 js 物件有。
- JSON物件 沒有分號,而 js 物件有。
// js 物件var obj = {
name : "pingan", age : "25",
};
// json 物件{
"name" : "pingan", "age" : "25", "box" : [ "a","b","c" ]
}複製程式碼
2.3 陣列型別
內容放在方括號
內。
JSON陣列也沒有分號和變數,常常可以把JSON陣列和物件結合使用,構成更復雜的資料集合。
[ {
"name" : "leo", "age" : 25, "box" : ["a","b","c"]
}, {
"name" : "pingan", "age" : 25, "box" : ["a","b","c"]
}]複製程式碼
3. 使用
JSON最常見的用法就是,從服務端獲取JSON資料,再將JSON資料轉成JavaScrip物件使用。
JSON物件有兩個方法:
JSON.stringify()
: 序列化操作,將JavaScript物件
轉換成JSON字串
。JSON.prase()
:反序列化操作,將JSON字串
解析成JavaScript值
。
3.1 序列化操作
序列化操作常常使用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資料型別的例項屬性。
3.2 反序列化操作
序列化操作常常使用JSON.parse()
。
簡單例子:
let copyPingan = JSON.parse(pingan);
copyPingan;
// {name: "leo", age: 25, box: Array(3)
}複製程式碼
如果傳入JSON.parse()
的字串不是有效的JSON,則會丟擲錯誤。
注意:
雖然pingan
和copyPingan
屬性相同,但兩者獨立,沒有任何關係。
4.序列化選項
JSON.stringify()
除了要傳入序列化物件作為引數,還可以接收其他兩個引數,用來指定序列化JavaScript物件的方式:
- 過濾器:可以是個陣列,也可以是個函式。
- 選項:表示是否在
JSON字串
中保留縮排。
單獨或組合使用兩者,可以更加全面深入的控制JSON的序列化。
4.1 過濾器
若過濾器的引數是陣列,則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
。
4.2 選項
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" ]
}"*/複製程式碼
5.解析選項
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"
}"複製程式碼
參考文章:
- W3school JSON教程
- 《JavaScrip高階程式設計》
本部分內容到這結束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推薦 | github.com/pingan8787/… |
JS小冊 | js.pingan8787.com |