0. 背景
XML曾是web結構化數據傳輸的事實標準,然而業界一直不乏質疑XML的聲音,也發展出了一些替代方案,JSON就是最流行的一種。
JSON(JavaScript Object Notation,JavaScript對象表示法)是JavaScript語言的嚴格子集,通過JavaScript的模式來結構化表示數據。JSON擁有類似XML的特點:純文本、自我描述性、層級結構等。並不是只有JavaScript可以使用JSON,作爲一種廣泛使用的數據格式,絕大多數語言已經支持JSON的解析和序列化。
1. 基本語法
- 基本類型:數值、布爾值、字符串、null
- 對象:一組有序鍵值對。每個鍵值對的值又可以是任意類型
- 數組:一組有序值的列表,可按數值索引訪問。每個值都可以是任意類型
1.1 基本類型
1.2 對象
{
"name": "Morty",
"age": 14
}
{
"name": "Morty",
"age": 14,
"grandpa": {
"name": "Rick",
"age": 70
}
}
1.3 數組
{
"name": "Morty",
"age": 14,
"grandpa": {
"name": "Rick",
"age": 70
},
"parent": [
{"name": "Jerry", "age": 35},
{"name": "Beth", "age": 35}
]
}
2. 解析和序列化
2.1 JSON對象
- stringify(),將JavaScript對象序列化爲JSON字符串
- parse(),和將JSON字符串解析爲JavaScript對象。
var computer = {
CPU: "i7 8700K",
GPU: "GTX 1080Ti",
RAM: "16G DDR4",
DISK: ["256G SSD", "2T HDD"],
};
var jsonTest = JSON.stringify(computer); //序列化
var computerCopy = JSON.parse(jsonTest); //解析
默認情況下,stringify()輸出的JSON字符串中不會包含任何空白字符,上例中jsonTest如下:2.2 序列化
- 第一個參數:過濾器,一個數組或函數
- 第二個參數:選項,選擇JSON字符串是否縮進
2.2.1 過濾器
var jsonTest = JSON.stringify(computer, ["CPU", "GPU"]);
jsonTest如下:var jsonTest = JSON.stringify(computer, function(key, value) {
switch(key) {
case "CPU":
return undefined;
case "RAM":
return 16;
case "DISK":
return value.join("500G SSHD");
default:
return value;
}
});
var computerCopy = JSON.parse(jsonTest);
此時jsonTest如下:- 根據屬性名找到要處理的對象屬性
- 函數返回值就是處理後的屬性值(若返回undefined則該屬性會略過)
2.2.2 縮進控制
var jsonTest = JSON.stringify(computer, null, 4);
此時jsonTest如下:"CPU": "i7 8700K",
"GPU": "GTX 1080Ti",
"RAM": "16G DDR4",
"DISK": [
"256G SSD",
"2T HDD"
]
}
例如傳入字符串"--":
--"CPU": "i7 8700K",
--"GPU": "GTX 1080Ti",
--"RAM": "16G DDR4",
--"DISK": [
----"256G SSD",
----"2T HDD"
--]
}
2.2.3 toJSON()
var computer = {
CPU: "i7 8700K",
GPU: "GTX 1080Ti",
RAM: "16G DDR4",
DISK: ["256G SSD", "2T HDD"],
toJSON: function() {
return this.CPU + ", " + this.GPU;
}
};
var jsonTest = JSON.stringify(computer);
此時jsonText爲:2.3 解析
JSON.parse()也可以接受另一個參數:一個函數,也是作用於每個鍵值對。爲了區分JSON.stringify()上的替換函數(replacer),這個函數被稱爲還原函數(reviver),實際上兩個函數的參數是相同的:都是一對鍵值對。var computer = {
CPU: "i7 8700K",
GPU: "GTX 1080Ti",
RAM: "16G DDR4",
DISK: ["256G SSD", "2T HDD"],
releaseDate: new Date(2017, 11, 11)
};
var jsonTest = JSON.stringify(computer);
var computerCopy = JSON.parse(jsonTest, function(key, value) {
if (key === "releaseDate") {
return new Date(value);
} else {
return value;
}
});
console.log(computerCopy.releaseDate.getFullYear());
上例computer對象的屬性releaseDate中保存着一個Date對象。序列化後的jsonTest中保存着一個Date值,若不在parse()中將其轉化爲一個Date對象,就無法調用getFullYear()方法。