json是一種輕量級的數(shù)據(jù)交換格式,它基于 ECMAScript 規(guī)范的一個子集痊乾,采用完全獨立于編程語言的文本格式來存儲、表示椭更、傳輸數(shù)據(jù)哪审。json的語法與JavaScript語法及其相似。
json語法規(guī)則:
1.對象表示為鍵值對
2.數(shù)據(jù)由逗號分割
3.花括號保存對象
4.方括號保存數(shù)組
json語法示例:
var str = {
"name" : "wgq",
"age" : "18",
"arg" : [
{ "teacher" : "ce" ,"firstname" : "wang"},
{ "teacher2" : "ce" ,"firstname2" : "wang"}
]
}
在javascript中存在兩種json數(shù)據(jù)方式:
1.json字符串
2.json對象
其實json字符串用來進行數(shù)據(jù)傳輸(對象無法進行傳輸)虑瀑,json對象用來進行對內(nèi)容的表達輸出湿滓。
通過JSON.parse()函數(shù)可以把json字符串轉(zhuǎn)化為json對象,通過JSON.stringify()可以把json對象轉(zhuǎn)化為json字符串舌狗。下面我們來詳細介紹這兩個函數(shù)叽奥。
JSON.parse()
JSON.parse() 方法解析一個JSON字符串,構(gòu)造由字符串描述的JavaScript值或?qū)ο蟆?/p>
語法:JSON.parse(str[, fn]);
參數(shù):
str:要被解析的JSON字符串痛侍。
fn(可選):函數(shù)朝氓,可以在返回之前對解析的原始值進行改造。
首先 使用JSON.parse()恋日,不帶fn
//str為上面的json字符串
var obj = JSON.parse(str);
console.log(obj);
// {
// name : "wgq",
// age : "18",
// arg : [
// { teacher : "ce" ,firstname : "wang"},
// { teacher2 : "ce" ,firstname2 : "wang"}
// ]
// }
可以看到obj的屬性少了雙引號膀篮,它變成了json對象。
接下來使用fn :
fn(可選函數(shù))帶兩個參數(shù)k和v岂膳,k是鍵誓竿,v是值。
當解析字符串的每一個屬性時谈截,函數(shù)會按照解析的順序(從最里面的屬性開始筷屡,一級一級往外)分別調(diào)用fn函數(shù)(即解析一個屬性調(diào)用一次fn函數(shù))涧偷。
//str為上面的json字符串
var obj = JSON.parse(str,function(k,v){
if( k === "name"){
v = "123";
}
return v;
});
console.log(obj);
// {
// name : "123",
// age : "18",
// arg : [
// { teacher : "ce" ,firstname : "wang"},
// { teacher2 : "ce" ,firstname2 : "wang"}
// ]
// }
上面代碼寫到毙死,當遍歷到屬性name時燎潮,把name的值變?yōu)椤?23”。
函數(shù)解析順序:
JSON.parse(str扼倘,function(k,v){
conlose.log(k);
return v;
});
// name
// age
// teacher
// teacher2
// arg
// " "
由此可以看出确封,解析式從最最里層的屬性開始,一級級往外再菊,最終到達頂層爪喘。
fn的小知識點:
當遍歷到最頂層時,k的值為空字符串纠拔。
如果返回undefined秉剑,則當前屬性會從所屬對象中刪除。
JSON.stringify()
JSON.stringify() 方法將一個JSON對象轉(zhuǎn)換為一個JSON字符串
語法:JSON.stringify(str [,fn[, space]])
參數(shù):
str : 要被解析的json對象稠诲。
fn(可選) : 函數(shù)或者數(shù)組侦鹏,在序列化的過程中,被序列化的屬性都過經(jīng)過該函數(shù)的轉(zhuǎn)化和處理臀叙。如果第二個參數(shù)為數(shù)組略水,則序列化的json字符串只保留數(shù)組中的屬性名。如果該參數(shù)為null或者未聲明劝萤,則所有屬性都會被序列化聚请。
spance(可選) : 指定縮進,可以是數(shù)字或者字符串稳其。數(shù)字最高為10,字符串也最高取10個炸卑。
首先使用JSON.stringify()
//obj為上面的json對象
var jsonstr = JSON.parse(obj);
console.log(jsonstr);
// {
// "name" : "wgq",
// "age" : "18",
// "arg" : [
// { "teacher" : "ce" ,"firstname" : "wang"},
// { "teacher2" : "ce" ,"firstname2" : "wang"}
// ]
// }
這里可以看到既鞠,本來為json對象的obj又重新變回了json字符串。
使用fn
fn的函數(shù)使用跟JSON.parse()差不多盖文,可以參考上面所寫內(nèi)容嘱蛋。
如果fn為數(shù)組:
數(shù)組的值代表json序列化字符串的屬性名。
//obj為上面的json對象
var jsonstr = JSON.parse(obj五续,["name","age"]);
console.log(jsonstr);
// {
// "name" : "wgq",
// "age" : "18",
// }
上面代碼可以看到洒敏,只有在數(shù)組中出現(xiàn)的值就是json字符串中出現(xiàn)的屬性名。
使用space參數(shù):
space 參數(shù)用來控制結(jié)果字符串里面的間距疙驾。如果是一個數(shù)字, 則在字符串化時每一級別會比上一級別縮進多這個數(shù)字值的空格(最多10個空格)凶伙;如果是一個字符串,則每一級別會比上一級別多縮進用該字符串(或該字符串的前十個字符)它碎。
var obj ={
name : "wgq"
}
var str = JSON.stringify(obj)
console.log(str)// {"name":"wgq"}
var str2 = JSON.stringify(obj,null," ");
console.log(str2)
//{
// "name":"wgq"
//}
序列化注意事項:
1.非數(shù)組對象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中(即序列號后函荣,順序會亂)
2.布爾值显押、數(shù)字、字符串的包裝對象在序列化過程中會自動轉(zhuǎn)換成對應(yīng)的原始值傻挂。
3.undefined乘碑、任意的函數(shù)以及 symbol 值,在序列化過程中會被忽略(出現(xiàn)在非數(shù)組對象的屬性值中時)或者被轉(zhuǎn)換成 null(出現(xiàn)在數(shù)組中時)金拒。
4.所有以 symbol 為屬性鍵的屬性都會被完全忽略掉兽肤,即便 replacer 參數(shù)中強制指定包含了它們。
5.不可枚舉的屬性會被忽略绪抛。