Menu
JSON
在JavaScript里的JSON能保存的數(shù)據(jù)類型
20.2.1 JSON對(duì)象
20.2.3 解析選項(xiàng)
在JavaScript里的JSON能保存的數(shù)據(jù)類型
- 簡(jiǎn)單值(字符串虫腋、數(shù)值摧玫、布爾值和 null)、對(duì)象(python的字典)心包、數(shù)組;
- 20.2.1 JSON對(duì)象
- JSON 對(duì)象有兩個(gè)方法: stringify() 和 parse()履因。
- stringify()
- JavaScript 對(duì)象序列化為 JSON 字符串
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText= JSON.stringify(book)
// {"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}
-
JSON.stringify()有兩個(gè)參數(shù):
- 第一個(gè)參數(shù)是個(gè)過濾器障簿,可以是一個(gè)數(shù)組,也可以是一個(gè)函數(shù)栅迄;
- 數(shù)組參數(shù):
- 保留數(shù)組里的key站故,其他的key忽略;
- var jsonText = JSON.stringify(book, ["title", "edition"]);
- 函數(shù)參數(shù):
- 函數(shù)過濾器根據(jù)傳入的鍵來決定結(jié)果;
var json = JSON.stringify(book, function (key,value) {
// 如果key是title西篓,那么title的value返回大寫的value愈腾;
if(key=="title"){
return value.toUpperCase()
}
// 如果key為authors,那么通過返回undefined來刪除this key岂津;
else if (key=="authors"){
return undefined
}
// 如果key為edition虱黄,那么將這個(gè)key的value做計(jì)算后返回;
else if (key=="edition"){
return value - 1
}
// 其他默認(rèn)返回原來的value吮成;
else{
return value
}
})
// {"title":"PROFESSIONAL JAVASCRIPT","edition":2,"year":2011}
- 第二個(gè)參數(shù)是一個(gè)選項(xiàng)橱乱,表示是否在 JSON 字符串中保留縮進(jìn)如果這個(gè)參數(shù)是一個(gè)數(shù)值,最大縮進(jìn)空格數(shù)為 10粱甫,所有大于 10 的值都會(huì)自動(dòng)轉(zhuǎn)換為 10泳叠。那它表示的是每個(gè)級(jí)別縮進(jìn)的空格數(shù)。如果是字符串茶宵,那么代表每次縮進(jìn)都用這個(gè)字符串代替縮進(jìn)空格危纫;
// 每一層縮進(jìn)4個(gè)空格;
- var jsonText = JSON.stringify(book, null, 4);
// 每一層縮進(jìn)一個(gè)“--”符號(hào)乌庶;
- var json = JSON.stringify(book, null, "--");
{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas"
--],
--"edition": 3,
--"year": 2011
}
// 還原成Javascript對(duì)象种蝶;
// 如果參數(shù)不是有效的JSON對(duì)象就會(huì)報(bào)錯(cuò);
var bookCopy = JSON.parse(jsonText)
-
3. toJSON()方法
- JSON.stringify()瞒大,序列化該對(duì)象的順序如下:
- (1) 如果存在 toJSON()方法而且能通過它取得有效的值蛤吓,則調(diào)用該方法。否則糠赦,返回對(duì)象本身。
- (1) (2) 如果提供了第二個(gè)參數(shù)锅棕,應(yīng)用這個(gè)函數(shù)過濾器拙泽。傳入函數(shù)過濾器的值是第(1)步返回的值。
- (1) (3) 對(duì)第(2)步返回的每個(gè)值進(jìn)行相應(yīng)的序列化裸燎。
- (1) (4) 如果提供了第三個(gè)參數(shù)顾瞻,執(zhí)行相應(yīng)的格式化。
- 如果一個(gè)被序列化的對(duì)象擁有 toJSON 方法德绿,那么該 toJSON 方法就會(huì)覆蓋該對(duì)象默認(rèn)的序列化行為:不是那個(gè)對(duì)象被序列化荷荤,而是調(diào)用 toJSON 方法后的返回值會(huì)被序列化,例如:
var obj = {
foo: 'foo',
toJSON: function () {
return 'bar';
}
};
JSON.stringify(obj); // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'
20.2.3 解析選項(xiàng)
- JSON.parse()方法也可以接收另一個(gè)參數(shù)移稳,該參數(shù)是一個(gè)函數(shù)蕴纳,將在每個(gè)鍵值對(duì)兒上調(diào)用, 這個(gè)函數(shù)接收兩個(gè)參數(shù)个粱,一個(gè)鍵和一個(gè)值古毛,而且都需要返回一個(gè)值。如果還原函數(shù)返回 undefined,則表示要從結(jié)果中刪除相應(yīng)的鍵稻薇;如果返回其他值嫂冻,則將該值插入到結(jié)果中。
- 在將日期字符串轉(zhuǎn)換為 Date 對(duì)象時(shí)塞椎,經(jīng)常要用到還原函數(shù)桨仿。
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1) //js對(duì)象中releaseDate的值是一個(gè)Date對(duì)象;
};
var json = JSON.stringify(book); //Date對(duì)象在經(jīng)過序列化之后變成JSON 字符串案狠;
var bookCopy = JSON.parse(json, function(key, value) {
if (key == "releaseDate") {
return new Date(value); //經(jīng)過解析又在 bookCopy 中還原為一個(gè) Date對(duì)象服傍;
}
else {
return value;
}
});
document.write(json + "<br>")
document.write(bookCopy.releaseDate.getFullYear());
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者