最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js解析與序列化json數(shù)據(jù)(二)序列化探討

 更新時(shí)間:2013年02月01日 12:09:49   作者:  
上一節(jié)我們講解了JSON.stringify()的基本用法,這一節(jié)我們來重點(diǎn)探討一下序列化,單獨(dú)或組合使用這兩個(gè)參數(shù)(過濾器/數(shù)組),可以更全面深入地控制JSON的序列化,感興趣的朋友可以了解下,或許對你學(xué)習(xí)json有所幫助
上一節(jié)我們講解了JSON.stringify()的基本用法,這一節(jié)我們來重點(diǎn)探討一下序列化。
JSON.stringify()除了要序列化的js對象外,還可以接收另外兩個(gè)參數(shù),這兩個(gè)參數(shù)用于指定不同方式序列化js對象。第一個(gè)參數(shù)是過濾器,可以使一個(gè)數(shù)組,也可以是一個(gè)函數(shù);第二個(gè)參數(shù)是一個(gè)選項(xiàng),表示是否在JSON字符串中保留縮進(jìn)。單獨(dú)或組合使用這兩個(gè)參數(shù),可以更全面深入地控制JSON的序列化。
1、過濾結(jié)果
如果過濾器參數(shù)是數(shù)組,那么JSON.stringify()的結(jié)果中將只包含數(shù)組中列出的屬性。如:
復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114"
};
var jsonText=JSON.stringify(student,["name","id"]);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測試" />
</body>
</html>

jsonText的值為
{"name":"Bill","id":"802020114"}
如果第二個(gè)參數(shù)是函數(shù),行為會有一點(diǎn)不同。傳入的函數(shù)接收兩個(gè)參數(shù),屬性(鍵)名和屬性值。根據(jù)屬性(鍵)名可以知道應(yīng)該如何處理要序列化的對象中的屬性。屬性名只能是字符串。
為了改變序列化對象的結(jié)果,函數(shù)返回的值就是相應(yīng)鍵的值。不過要注意,如果函數(shù)返回了undefined,那么相應(yīng)的屬性會被忽略。如:
復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
var jsonText=JSON.stringify(student,jsonConvert);
}
function jsonConvert(key,value)
{
switch (key)
{
case "name":
return "Lily";
case "grade":
return undefined;
case "subject":
return value.join(",");
default :
return value;
}
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測試" />
</body>
</html>

這里函數(shù)過濾器根據(jù)傳入的鍵來決定結(jié)果。如果鍵為name,就將其值設(shè)置為Lily;如果為grade就返回undefined來刪除該屬性;如果為subject,它是一個(gè)數(shù)組,就將它通過數(shù)組方法join()轉(zhuǎn)化為以逗號連接的字符串。最后一定要提供default項(xiàng),使其他的值都能夠正常出現(xiàn)在結(jié)果中,不然就會出錯(cuò),沒有結(jié)果。實(shí)際上,第一次調(diào)用這個(gè)函數(shù)過濾器,傳入的鍵是一個(gè)空字符串,而值就是student對象。上面的jsonText的值如下:
{"name":"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
在內(nèi)部是按順序遍歷每一個(gè)對象每一個(gè)屬性,所以公開key,value函數(shù)方法需要注意你的函數(shù)只有著兩個(gè)參數(shù)才能起效,要理解函數(shù)的目的,就是在內(nèi)部機(jī)制遍歷每一個(gè)屬性的時(shí)候讓你來修改部分結(jié)果,并且是一次遍歷每一個(gè)對象,這樣在序列化對象中每一個(gè)對象都要經(jīng)過過濾器。
2、字符串縮進(jìn)
JSON.stringify()方法的第三個(gè)參數(shù)用于控制結(jié)果中的縮進(jìn)和空白符。如果這個(gè)參數(shù)是一個(gè)數(shù)值,那么它表示的是每個(gè)級別縮進(jìn)的空格數(shù)。如:
復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
var jsonText=JSON.stringify(student,null,8);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測試" />
</body>
</html>

保存在jsonText中的字符串為:
復(fù)制代碼 代碼如下:

{
"name": "Bill",
"age": 12,
"grade": 3,
"id": "0802020114",
"subject": [
"math",
"Chinese",
"English"
]
}

JSON.stringify()在結(jié)果字符串中插入了換行符以提高可讀性。只要傳入有效的控制縮進(jìn)的參數(shù)值,結(jié)果字符串就會包含換行符(只縮進(jìn)而不換行意義不大)。最大縮進(jìn)空格數(shù)位10,所有大于10的值都會自定轉(zhuǎn)換為10。

如果縮進(jìn)參數(shù)是一個(gè)字符串而非數(shù)值,則這個(gè)字符串將在JSON字符串中被用作縮進(jìn)字符(不再使用空格)。如可以實(shí)現(xiàn)如下的效果:
復(fù)制代碼 代碼如下:

{
*"name": "Bill",
*"age": 12,
*"grade": 3,
*"id": "0802020114",
*"subject": [
**"math",
**"Chinese",
**"English"
*]
}

同樣字符串最長不能超過10個(gè)字符長。如果超過,結(jié)果中將只出現(xiàn)10個(gè)字符。
3、toJSON()方法
有時(shí)候JSON.stringify()還是不能滿足對某些對象進(jìn)行自定義序列化的需求。在這些情況下,可以通過對象上調(diào)用toJSON()方法,返回其自身的JSON數(shù)據(jù)格式。如:
復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"],
toJSON:function(){
return this.name+"_"+this.id;
}
};
var jsonText=JSON.stringify(student);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測試" />
</body>
</html>

以上代碼在student對象上定義了一個(gè)toJSON()方法,該方法返回name和id的組合。最后jsonText的值如下:
"Bill_0802020114"
toJSON()可以作為函數(shù)過濾器的補(bǔ)充,因此理解序列化的內(nèi)部順序十分重要。假設(shè)把一個(gè)對象傳入JSON.stringify(),序列化該對象的順序是:
(1)如果存在toJSON()方法而且能夠通過它取得有效值,則調(diào)用該方法。否則,按默認(rèn)順序執(zhí)行序列化。
(2)如果提供了第二個(gè)參數(shù),應(yīng)用這個(gè)函數(shù)過濾器。傳入函數(shù)過濾器的值是第(1)步返回的值。
(3)對第(2)步返回的每個(gè)值進(jìn)行相應(yīng)的序列化。
(4)如果提供了第三個(gè)參數(shù),執(zhí)行相應(yīng)的格式化。
無論是考慮滴定toJSON()方法,還是考慮使用函數(shù)過濾器,或者需要同時(shí)使用兩者,理解這個(gè)順序都是至關(guān)重要的。

相關(guān)文章

最新評論

神农架林区| 襄汾县| 潍坊市| 仁布县| 阜新市| 阿拉善右旗| 金溪县| 玉环县| 冀州市| 张北县| 霍山县| 隆林| 黔江区| 长垣县| 五河县| 北京市| 商南县| 青岛市| 祁连县| 江达县| 阳山县| 商都县| 汉源县| 珠海市| 历史| 石棉县| 贵溪市| 股票| 山东省| 鄂尔多斯市| 西吉县| 将乐县| 安岳县| 元江| 大姚县| 宁海县| 浪卡子县| 汶川县| 绥江县| 镶黄旗| 抚顺市|