JavaScript:JSON
JSON是一種資料格式,它並不從屬於JavaScript,很多語言都有JSON的解析器和序列化器。
語法
JSON可以表示三種類型:
- 簡單值:使用與JavaScript相同的語法,可以在JSON中表示字串、數值、布林值和null。
- 物件:表示一組無序的鍵值對。鍵值對中的值可以是簡單值,也可以是複雜資料型別。
- 數值:表示一組有序的值的列表,陣列的值可以是任意型別。
JSON不支援變數、函式或物件例項,是一種表示結構化資料的格式。
簡單值
JSON資料形式:
5 // 數值
"Hello JavaScript" // 字串
null
物件
與JavaScript不同,JSON中的物件要求給屬性加上引號
{
"name": "蕭蕭弈寒";
"age": 100
}
// 屬性的值也可以是複雜型別
{
"school": {
"name": "hafo",
"location": "Harbin"
}
}
陣列
JSON表示陣列:
[100, "蕭蕭弈寒", true]
JSON陣列沒有變數和分號。
把陣列和物件結合,可以構造複雜的資料集合:
[
{
"title":"Java從入門到放棄",
"authors":[
"張三"
],
edition: 2
},
{
"title":"MySQL從刪庫到跑路",
"authors":[
"李四"
],
edition: 3
},
{
"title":"Dreamweaver從安裝到解除安裝",
"authors":[
"王五"
],
edition: 4
}
]
解析與序列化
JSON物件
JSON物件有兩個方法:
- stringfy():把JavaScript物件序列化為JSON字串
- parse():。把JSON字串解析為原生JavaScript值
示例:
var book = {
"title":"Java從入門到放棄",
"authors":[
"張三"
],
edition: 2
};
var jsonText = JSON.stringify(book);
alert(jsonText); // {"title":"Java從入門到放棄","authors":["張三"],"edition":2}
上面的例子將一個JavaScript物件序列化為一個JSON字串。預設情況下,JSON.stringify()不包含任何字元或縮排。
將JSON字串直接傳遞個JSON.parse()可以得到相應的JavaScript值。
var newBook = JSON.parse(jsonText);
book與newBook具有相同的屬性,但是彼此是相互獨立的。
序列化選項
JSON.stringify()還可以接收兩個引數:
- 第一個引數:過濾器,一個數組或一個函式。
- 第二個引數:一個選項,表示是否在JSON字串中保留縮排
過濾結果
如果引數是陣列,JSON.stringify()的結果只包含陣列中列出的屬性。
var book = {
"title":"Java從入門到放棄",
"authors":[
"張三"
],
edition: 2
};
var jsonText = JSON.stringify(book, ["title", "authors"]);
console.log(jsonText); // {"title":"Java從入門到放棄","authors":["張三"]}
如果引數是函式,傳入的函式接收兩個引數,屬性名和屬性值,根據屬性名可以知道如何處理屬性。屬性名是字串,屬性值並非鍵值對的值,鍵名可以是空字串。
返回的值是相應鍵的值,如果函式返回undefined,那麼該屬性就會被忽略。
var book = {
"title":"Java programming",
"authors":[
"張三",
"李四"
],
edition: 2
};
var jsonText = JSON.stringify(book, function (key, value) {
switch (key) {
case "authors":
return value.join("-"); // 用“-”分割陣列
case "edition":
return undefined;
default :
return value;
}
});
console.log(jsonText); // {"title":"Java programming","authors":"張三-李四"}
字串縮排
JSON.stringify()的第三個引數用於控制結果中的縮排和空白符。如果是數值,表示每格縮排的空格數。
var book = {
"title":"Java programming",
"authors":[
"蕭蕭弈寒",
],
edition: 2
};
var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText);
如果是字串,這個字串將用作JSON字串的縮排符
var book = {
"title":"Java programming",
"authors":[
"蕭蕭弈寒",
],
edition: 2
};
var jsonText = JSON.stringify(book, null, "__");
console.log(jsonText);
【顯示結果】:
{
__"title": "Java programming",
__"authors": [
____"蕭蕭弈寒"
__],
__"edition": 2
}
縮排字串最多隻能包含10個字元。
toJSON()方法
JSON.stringify()並不能滿足所有物件進行序列化的需求。可以給物件定義toJSON()方法,返回其自身的JSON資料格式。
示例:
var book = {
"title":"Java programming",
"authors":[
"蕭蕭弈寒",
],
edition: 2,
toJSON: function () {
return "==="+this.title+"===";
}
};
var jsonText = JSON.stringify(book);
console.log(jsonText); // "===Java programming==="
解析選項
JSON.parse()方法也可以接收另一個引數,該引數是一個函式,將在每個鍵值對上呼叫。如果返回undefined,表示從結果中刪除相應的鍵,如果返回其他值,則將該值插入到結果中。
var book = {
"title":"Java programming",
"authors":[
"蕭蕭弈寒",
],
edition: 2,
year: 2017,
releaseDate: new Date(2017, 11, 1)
};
var jsonText = JSON.stringify(book);
var newBook = JSON.parse(jsonText, function (key, value) {
if (key == "releaseDate") {
return new Date(value);
} else {
return value;
}
});
console.log(newBook.releaseDate.getFullYear()); // 2017
上面新增了releaseDate屬性,該屬性儲存著一個Date物件。經過序列化後,變成了一個有效的JSON字串,然後又在newBook中還原成一個Date物件。