- 以下js對(duì)象用JSON.stringify()執(zhí)行后诅愚,是什么樣的花椭?**
- 如何將最終的JSON字符串里面姓名相關(guān)的內(nèi)容全部換成大寫阿浓,也就是把"Good"--->"GOOD"堕战,把"Man"--->"MAN"
var friend={
firstName: 'Good',
'lastName': 'Man',
'address': undefined,
'phone': ["1234567",undefined],
'fullName': function(){
return this.firstName + ' ' + this.lastName;
}
};
相關(guān)js函數(shù)介紹
將JS數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為JSON字符串——JSON.stringify#
這個(gè)函數(shù)的函數(shù)簽名是這樣的:
JSON.stringify(value[, replacer [, space]])
下面將分別展開帶1~3個(gè)參數(shù)的用法,最后是它在序列化時(shí)做的一些“聰明”的事引几,要特別注意单雾。
-
基本使用---僅需一個(gè)參數(shù)###
傳入一個(gè)JSON格式的JS對(duì)象或者數(shù)組,JSON.stringify({"name":"Good Man","age":18})返回一個(gè)字符串"{"name":"Good Man","age":18}"
-
第二個(gè)參數(shù)可以是函數(shù)她紫,也可以是一個(gè)數(shù)組###
如果第二個(gè)參數(shù)是一個(gè)函數(shù),那么序列化過程中的每個(gè)屬性都會(huì)被這個(gè)函數(shù)轉(zhuǎn)化和處理
如果第二個(gè)參數(shù)是一個(gè)數(shù)組屿储,那么只有包含在這個(gè)數(shù)組中的屬性才會(huì)被序列化到最終的JSON字符串中
如果第二個(gè)參數(shù)是null贿讹,那作用上和空著沒啥區(qū)別,但是不想設(shè)置第二個(gè)參數(shù)够掠,只是想設(shè)置第三個(gè)參數(shù)的時(shí)候民褂,就可以設(shè)置第二個(gè)參數(shù)為null
- 第二個(gè)參數(shù)是函數(shù)
var friend={
"firstName": "Good",
"lastName": "Man",
"phone":"1234567",
"age":18
};
var friendAfter=JSON.stringify(friend,function(key,value){
if(key==="phone")
return "(000)"+value;
else if(typeof value === "number")
return value + 10;
else
return value; //如果你把這個(gè)else分句刪除,那么結(jié)果會(huì)是undefined
});
console.log(friendAfter);
//輸出:{"firstName":"Good","lastName":"Man","phone":"(000)1234567","age":28}
如果制定了第二個(gè)參數(shù)是函數(shù)疯潭,那么這個(gè)函數(shù)必須對(duì)每一項(xiàng)都有返回赊堪,這個(gè)函數(shù)接受兩個(gè)參數(shù),一個(gè)鍵名竖哩,一個(gè)是屬性值哭廉,函數(shù)必須針對(duì)每一個(gè)原來的屬性值都要有新屬性值的返回。
- 第二個(gè)參數(shù)為數(shù)組
var friend={
"firstName": "Good",
"lastName": "Man",
"phone":"1234567",
"age":18
};
//注意下面的數(shù)組有一個(gè)值并不是上面對(duì)象的任何一個(gè)屬性名
var friendAfter=JSON.stringify(friend,["firstName","address","phone"]);
console.log(friendAfter);
//{"firstName":"Good","phone":"1234567"}
//指定的“address”由于沒有在原來的對(duì)象中找到而被忽略
如果第二個(gè)參數(shù)是一個(gè)數(shù)組相叁,那么只有在數(shù)組中出現(xiàn)的屬性才會(huì)被序列化進(jìn)結(jié)果字符串遵绰,只要在這個(gè)提供的數(shù)組中找不到的屬性就不會(huì)被包含進(jìn)去,而這個(gè)數(shù)組中存在但是源JS對(duì)象中不存在的屬性會(huì)被忽略增淹,不會(huì)報(bào)錯(cuò)椿访。
- 第三個(gè)參數(shù)用于美化輸出——不建議用
指定縮進(jìn)用的空白字符,可以取以下幾個(gè)值
是字符串的話虑润,就用該字符串代替空格成玫,最多取這個(gè)字符串的前10個(gè)字符
沒有提供該參數(shù) 等于 設(shè)置成null 等于 設(shè)置一個(gè)小于1的數(shù)
var friend={
"firstName": "Good",
"lastName": "Man",
"phone":{"home":"1234567","work":"7654321"}
};
//直接轉(zhuǎn)化是這樣的:
//{"firstName":"Good","lastName":"Man","phone":{"home":"1234567","work":"7654321"}}
var friendAfter=JSON.stringify(friend,null,4);
console.log(friendAfter);
{
"firstName": "Good",
"lastName": "Man",
"phone": {
"home": "1234567",
"work": "7654321"
}
}
JSON.stringify函數(shù)的其他作用#
- 鍵名不是雙引號(hào)的(包括沒有引號(hào)或者是單引號(hào)),會(huì)自動(dòng)變成雙引號(hào);字符串是單引號(hào)的哭当,會(huì)自動(dòng)變成雙引號(hào)
最后一個(gè)屬性后面有逗號(hào)的猪腕,會(huì)被自動(dòng)去掉 - 非數(shù)組對(duì)象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中
這個(gè)好理解,也就是對(duì)非數(shù)組對(duì)象在最終字符串中不保證屬性順序和原來一致 - 布爾值荣病、數(shù)字码撰、字符串的包裝對(duì)象在序列化過程中會(huì)自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的原始值
也就是你的什么new String("bala")會(huì)變成"bala",new Number(2017)會(huì)變成2017 - undefined个盆、任意的函數(shù)以及 symbol 值(symbol詳見ES6對(duì)symbol的介紹
出現(xiàn)在非數(shù)組對(duì)象的屬性值中:在序列化過程中會(huì)被忽略
出現(xiàn)在數(shù)組中時(shí):被轉(zhuǎn)換成 null
JSON.stringify({x: undefined, y: function(){return 1;}, z: Symbol("")});
//出現(xiàn)在非數(shù)組對(duì)象的屬性值中被忽略:"{}"
JSON.stringify([undefined, Object, Symbol("")]);
//出現(xiàn)在數(shù)組對(duì)象的屬性值中脖岛,變成null:"[null,null,null]"
- NaN、Infinity和-Infinity颊亮,不論在數(shù)組還是非數(shù)組的對(duì)象中柴梆,都被轉(zhuǎn)化為null
- 所有以 symbol 為屬性鍵的屬性都會(huì)被完全忽略掉,即便 replacer 參數(shù)中強(qiáng)制指定包含了它們
- 不可枚舉的屬性會(huì)被忽略
將JSON字符串解析為JS數(shù)據(jù)結(jié)構(gòu)——JSON.parse#
這個(gè)函數(shù)的函數(shù)簽名是這樣的:
JSON.parse(text[, reviver])
如果第一個(gè)參數(shù)终惑,即JSON字符串不是合法的字符串的話绍在,那么這個(gè)函數(shù)會(huì)拋出錯(cuò)誤,所以如果你在寫一個(gè)后端返回JSON字符串的腳本雹有,最好調(diào)用語(yǔ)言本身的JSON字符串相關(guān)序列化函數(shù)偿渡,而如果是自己去拼接實(shí)現(xiàn)的序列化字符串,那么就尤其要注意序列化后的字符串是否是合法的霸奕,合法指這個(gè)JSON字符串完全符合JSON要求的嚴(yán)格格式
值得注意的是這里有一個(gè)可選的第二個(gè)參數(shù)溜宽,這個(gè)參數(shù)必須是一個(gè)函數(shù),這個(gè)函數(shù)作用在屬性已經(jīng)被解析但是還沒返回前质帅,將屬性處理后再返回适揉。
var friend={
"firstName": "Good",
"lastName": "Man",
"phone":{"home":"1234567","work":["7654321","999000"]}
};
//我們先將其序列化
var friendAfter=JSON.stringify(friend);
//'{"firstName":"Good","lastName":"Man","phone":{"home":"1234567","work":["7654321","999000"]}}'
//再將其解析出來,在第二個(gè)參數(shù)的函數(shù)中打印出key和value
JSON.parse(friendAfter,function(k,v){
console.log(k);
console.log(v);
console.log("----");
});
影響 JSON.stringify 的神奇函數(shù)——object.toJSON#
如果你在一個(gè)JS對(duì)象上實(shí)現(xiàn)了toJSON方法煤惩,那么調(diào)用JSON.stringify去序列化這個(gè)JS對(duì)象時(shí)嫉嘀,JSON.stringify會(huì)把這個(gè)對(duì)象的toJSON方法返回的值作為參數(shù)去進(jìn)行序列化。
var info={
"msg":"I Love You",
"toJSON":function(){
var replaceMsg=new Object();
replaceMsg["msg"]="Go Die";
return replaceMsg;
}
};
JSON.stringify(info);
//出si了魄揉,返回的是:'"{"msg":"Go Die"}"',說好的忽略函數(shù)呢