JSON與JavaScript對象
JSON是一種表示結(jié)構(gòu)化數(shù)據(jù)的存儲格式,語法格式上與JavasScript對象有些類似颜矿。
TIPS: 與JavaScript對象的格式區(qū)別
- 不支持變量寄猩、函數(shù)或?qū)ο髮嵗?/li>
- 字符串,屬性名必須使用雙引號
- 無需定義變量存儲引用
// JSON對象
{
"name": "KenTsang",
"age": 27,
"job": "Developer"
}
// js對象(該對象將作在后續(xù)例子引用)
let person = {
name: 'KenTsang',
age: 27,
job: 'Developer'
}
ES5定義了一個全局對象JSON骑疆,IE8+以上支持田篇,該對象提供來stringify
和parse
兩個方法用于JSON數(shù)據(jù)解析和序列化。
stringify()
stringify用于把JavaScript對象序列化JSON字符串箍铭,
在序列化JavaScript對象時泊柬,所有函數(shù)及原型成員都會被有意忽略,不體現(xiàn)在結(jié)果中诈火。此外兽赁,值為undefined的任何屬性也都會被跳過。
JSON.stringify(
value: Object,
replace: Array | function(key,value) {},
space: number | string
)
該方法接受三個參數(shù)
- 參數(shù):接收傳入的js對象
- 參數(shù):過濾器(數(shù)組/函數(shù))
- 參數(shù):字符串縮進(jìn)(數(shù)值/字符串)
參數(shù)2 - 過濾器
TIPS1: 過濾器是一個數(shù)組時冷守,序列化結(jié)果只包含數(shù)組中列出的屬性
let result = JSON.stringify(person, ["name", "job"]);
// 輸出結(jié)果
// {"name":"KenTsang","job":"Developer"}
TIPS2: 過濾器是一個函數(shù)時(替換函數(shù))
var jsonStr = JSON.stringify(Person, function(key, value){
if (key == 'age') {
return 'secret';
} else {
return value;
}
})
// 輸出結(jié)果
// {"name":"KenTsang","age":"secret","job":"Developer"}
如果替換函數(shù)返回的是undefined
刀崖,則該屬性不會被包含在序列化結(jié)果中赚爵。
參數(shù)3 - 字符串縮進(jìn)
用于控制序列化結(jié)果中的縮進(jìn)和空白符笙瑟,輸出序列結(jié)果帶縮進(jìn)格式,方便預(yù)覽查看蟹地。實際應(yīng)用開發(fā)不多授翻。
- 為數(shù)值時或悲,表示每個級別縮進(jìn)的空格數(shù)(最大10)
- 為字符串時,則作為縮進(jìn)字符(替換默認(rèn)的空格堪唐,最大10個字符)
let result = JSON.stringify(person, null, '--');
// 輸出結(jié)果
/*
{
--"name": "KenTsang",
--"age": 27,
--"job": "Developer"
}
*/
toJSON()方法
應(yīng)對更復(fù)雜的一些需求巡语,我們可以通過toJSON()對某些對象進(jìn)行自定義序列化的需求。
let person = {
name: "KenTsang",
age: 28,
job: 'Developer',
toJSON: function() {
return {
"name": "KT",
"age": "2*",
"job": "DP"
}
}
};
let result = JSON.stringify(person);
// 輸出結(jié)果
// {"name":"KT","age":"2*","job":"DP"}
TIPS: 序列化順序
- 如果存著toJSON方法而且能通過它取得有效的值淮菠,則調(diào)用該方法男公。否則,返回對象本身合陵。
- 如果提供了第二個參數(shù)枢赔,應(yīng)用這個函數(shù)過濾器。傳入函數(shù)過濾器的值是第(1)步的值拥知。
- 對第(2)步返回的每個值進(jìn)行相應(yīng)的序列化踏拜。
- 如果提供了第三個參數(shù),執(zhí)行相應(yīng)的格式化低剔。
-- 摘自《JavaScript高級程序設(shè)計》--
parse()
parse用于把JSON字符串解析成JavaScript對象
JSON.parse(text: string, reviver: function(key, value) {})
該方法接受三個參數(shù)
- 參數(shù):接收傳入的json字符串
- 參數(shù):還原函數(shù)
還原函數(shù)
- 返回undefined, 結(jié)果中刪除相應(yīng)的鍵
- 返回其它值速梗,則將值插入到結(jié)果中
let Person = {
name: "KenTsang",
age: 28,
job: "Developer",
birth: new Date(1991, 3, 19)
};
var jsonStr = JSON.stringify(Person);
var jsObj = JSON.parse(jsonStr, function(key, value) {
if (key == 'birth') {
return new Date(value);
} else {
return value);
}
});
jsObj.birth.getFullYearh();
// 輸出結(jié)果: 1991
例子中通過還原函數(shù)肮塞,重新實例一個Date對象,所以可以用到getFullYear()
方法姻锁。
參考文檔
作者:以樂之名
本文原創(chuàng)枕赵,有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請指明出處位隶。