1 JSON的特點
JSON是一個輕量級的數(shù)據(jù)格式,可以簡化表示復(fù)雜數(shù)據(jù)結(jié)構(gòu)的工作量。
2 JSON和JS的語法差別
1??JSON語法可以表示三類值:簡單值,對象宛逗,數(shù)組。
JS和JSON钦椭,字符串區(qū)別是JSON里的字符串必須用雙引號拧额,用單引號會有語法錯誤。
2??JSON對象和JS對象字面量的不同: 1.沒有聲明變量 2.沒有末尾的分號
JS對象字面量的標準方式:
var person = {
name: "song",
age:18
};
也可以這樣:
var person = {
"name": "song",
"age": 18
};
JSON表示對象的方法如下:
{
"name": "song",
"age": 18
}
??這里補充一條:
json表示數(shù)組的方法: { "author":[ "age", 25, true]}
3 JSON的序列化
json.stringify()除了要序列化的js對象外彪腔,還可以接受兩個參數(shù)侥锦。
?? 第一個參數(shù)的作用是過濾,參數(shù)可以是數(shù)組德挣,也可以是函數(shù)恭垦;
?? 第二個參數(shù)是一個選項,表示是否在json字符串中保留縮緊格嗅。
單獨或組合使用這兩個參數(shù)番挺,可以更全面深入地控制json的序列化。
過濾結(jié)果
?? 如果過濾器是數(shù)組屯掖,則結(jié)果中只包含數(shù)組中列出來的屬性玄柏,例:
var book = {
"title" : "hello",
"author" : ["song"],
"edition" : 3,
"year" : 2011
};
var jsonText = JSON.stringify(book,["title","edition"]);
運行結(jié)果:
jsonText={
title:"hello",
edition:3
};
?? 如果過濾器是函數(shù),傳入的函數(shù)需要接收兩個參數(shù)贴铜,分別是屬性名和屬性值粪摘,根據(jù)屬性名可以知道應(yīng)該如何處理要序列化的對象的屬性。例:
var book = {
"title" : "hello",
"author" : ["song"],
"edition" : 3,
"year" : 2011
};
var jsonText = JSON.stringify(book,function(key, value){
switch(key) {
case "author":
return value.json(",");
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
})
這里绍坝,函數(shù)過濾器根據(jù)傳入的值來決定徘意,如果鍵是“authors”,就將數(shù)組連接為一個字符串轩褐;如果鍵為“year”椎咧,則將其值設(shè)為5000;如果鍵為“edition”把介,通過返回“undefined”刪除該屬性勤讽。
?? 最后一定要提供default項。
??總結(jié):
如果把一個對象傳進JSON.stringify()拗踢,序列化該對象的順序如下:
1?? 如果存在toJSON()方法地技,而且能通過他取得有效的值,則調(diào)用該方法秒拔,否則莫矗,返回對象本身。
2?? 如果提供了第二個參數(shù)砂缩,應(yīng)用這個函數(shù)過濾器作谚,傳入函數(shù)過濾器的值是1??返回的值。
3?? 對2??返回的每個值進行相應(yīng)的序列化庵芭。
4?? 如果提供了第三個參數(shù)妹懒,執(zhí)行相應(yīng)的格式化。
4 JSON的解析
JSON.parse()方法也可以接收另一個參數(shù)双吆,該參數(shù)是一個函數(shù)眨唬,將在每個鍵值對上調(diào)用会前,這個函數(shù)被稱為還原函數(shù)。例:
var book = {
"title" : "hello",
"author" : ["song"],
"edition" : 3,
"year" : 2011,
releaseDate : new Date(2011,11,1)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
if(key == "releaseDate"){
return new Date(value);
}else{
return value;
}
});