js解析與序列化json數(shù)據(jù)(二)序列化探討
更新時(shí)間:2013年02月01日 12:09:49 作者:
上一節(jié)我們講解了JSON.stringify()的基本用法,這一節(jié)我們來重點(diǎn)探討一下序列化,單獨(dú)或組合使用這兩個(gè)參數(shù)(過濾器/數(shù)組),可以更全面深入地控制JSON的序列化,感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)json有所幫助
上一節(jié)我們講解了JSON.stringify()的基本用法,這一節(jié)我們來重點(diǎn)探討一下序列化。
JSON.stringify()除了要序列化的js對(duì)象外,還可以接收另外兩個(gè)參數(shù),這兩個(gè)參數(shù)用于指定不同方式序列化js對(duì)象。第一個(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ù)組中列出的屬性。如:
<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="測(cè)試" />
</body>
</html>
jsonText的值為
{"name":"Bill","id":"802020114"}
如果第二個(gè)參數(shù)是函數(shù),行為會(huì)有一點(diǎn)不同。傳入的函數(shù)接收兩個(gè)參數(shù),屬性(鍵)名和屬性值。根據(jù)屬性(鍵)名可以知道應(yīng)該如何處理要序列化的對(duì)象中的屬性。屬性名只能是字符串。
為了改變序列化對(duì)象的結(jié)果,函數(shù)返回的值就是相應(yīng)鍵的值。不過要注意,如果函數(shù)返回了undefined,那么相應(yīng)的屬性會(huì)被忽略。如:
<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="測(cè)試" />
</body>
</html>
這里函數(shù)過濾器根據(jù)傳入的鍵來決定結(jié)果。如果鍵為name,就將其值設(shè)置為L(zhǎng)ily;如果為grade就返回undefined來刪除該屬性;如果為subject,它是一個(gè)數(shù)組,就將它通過數(shù)組方法join()轉(zhuǎn)化為以逗號(hào)連接的字符串。最后一定要提供default項(xiàng),使其他的值都能夠正常出現(xiàn)在結(jié)果中,不然就會(huì)出錯(cuò),沒有結(jié)果。實(shí)際上,第一次調(diào)用這個(gè)函數(shù)過濾器,傳入的鍵是一個(gè)空字符串,而值就是student對(duì)象。上面的jsonText的值如下:
{"name":"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
在內(nèi)部是按順序遍歷每一個(gè)對(duì)象每一個(gè)屬性,所以公開key,value函數(shù)方法需要注意你的函數(shù)只有著兩個(gè)參數(shù)才能起效,要理解函數(shù)的目的,就是在內(nèi)部機(jī)制遍歷每一個(gè)屬性的時(shí)候讓你來修改部分結(jié)果,并且是一次遍歷每一個(gè)對(duì)象,這樣在序列化對(duì)象中每一個(gè)對(duì)象都要經(jīng)過過濾器。
2、字符串縮進(jìn)
JSON.stringify()方法的第三個(gè)參數(shù)用于控制結(jié)果中的縮進(jìn)和空白符。如果這個(gè)參數(shù)是一個(gè)數(shù)值,那么它表示的是每個(gè)級(jí)別縮進(jìn)的空格數(shù)。如:
<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="測(cè)試" />
</body>
</html>
保存在jsonText中的字符串為:
{
"name": "Bill",
"age": 12,
"grade": 3,
"id": "0802020114",
"subject": [
"math",
"Chinese",
"English"
]
}
JSON.stringify()在結(jié)果字符串中插入了換行符以提高可讀性。只要傳入有效的控制縮進(jìn)的參數(shù)值,結(jié)果字符串就會(huì)包含換行符(只縮進(jìn)而不換行意義不大)。最大縮進(jìn)空格數(shù)位10,所有大于10的值都會(huì)自定轉(zhuǎn)換為10。
如果縮進(jìn)參數(shù)是一個(gè)字符串而非數(shù)值,則這個(gè)字符串將在JSON字符串中被用作縮進(jìn)字符(不再使用空格)。如可以實(shí)現(xiàn)如下的效果:
{
*"name": "Bill",
*"age": 12,
*"grade": 3,
*"id": "0802020114",
*"subject": [
**"math",
**"Chinese",
**"English"
*]
}
同樣字符串最長(zhǎng)不能超過10個(gè)字符長(zhǎng)。如果超過,結(jié)果中將只出現(xiàn)10個(gè)字符。
3、toJSON()方法
有時(shí)候JSON.stringify()還是不能滿足對(duì)某些對(duì)象進(jìn)行自定義序列化的需求。在這些情況下,可以通過對(duì)象上調(diào)用toJSON()方法,返回其自身的JSON數(shù)據(jù)格式。如:
<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="測(cè)試" />
</body>
</html>
以上代碼在student對(duì)象上定義了一個(gè)toJSON()方法,該方法返回name和id的組合。最后jsonText的值如下:
"Bill_0802020114"
toJSON()可以作為函數(shù)過濾器的補(bǔ)充,因此理解序列化的內(nèi)部順序十分重要。假設(shè)把一個(gè)對(duì)象傳入JSON.stringify(),序列化該對(duì)象的順序是:
(1)如果存在toJSON()方法而且能夠通過它取得有效值,則調(diào)用該方法。否則,按默認(rèn)順序執(zhí)行序列化。
(2)如果提供了第二個(gè)參數(shù),應(yīng)用這個(gè)函數(shù)過濾器。傳入函數(shù)過濾器的值是第(1)步返回的值。
(3)對(duì)第(2)步返回的每個(gè)值進(jìn)行相應(yīng)的序列化。
(4)如果提供了第三個(gè)參數(shù),執(zhí)行相應(yīng)的格式化。
無論是考慮滴定toJSON()方法,還是考慮使用函數(shù)過濾器,或者需要同時(shí)使用兩者,理解這個(gè)順序都是至關(guān)重要的。
JSON.stringify()除了要序列化的js對(duì)象外,還可以接收另外兩個(gè)參數(shù),這兩個(gè)參數(shù)用于指定不同方式序列化js對(duì)象。第一個(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="測(cè)試" />
</body>
</html>
jsonText的值為
{"name":"Bill","id":"802020114"}
如果第二個(gè)參數(shù)是函數(shù),行為會(huì)有一點(diǎn)不同。傳入的函數(shù)接收兩個(gè)參數(shù),屬性(鍵)名和屬性值。根據(jù)屬性(鍵)名可以知道應(yīng)該如何處理要序列化的對(duì)象中的屬性。屬性名只能是字符串。
為了改變序列化對(duì)象的結(jié)果,函數(shù)返回的值就是相應(yīng)鍵的值。不過要注意,如果函數(shù)返回了undefined,那么相應(yīng)的屬性會(huì)被忽略。如:
復(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="測(cè)試" />
</body>
</html>
這里函數(shù)過濾器根據(jù)傳入的鍵來決定結(jié)果。如果鍵為name,就將其值設(shè)置為L(zhǎng)ily;如果為grade就返回undefined來刪除該屬性;如果為subject,它是一個(gè)數(shù)組,就將它通過數(shù)組方法join()轉(zhuǎn)化為以逗號(hào)連接的字符串。最后一定要提供default項(xiàng),使其他的值都能夠正常出現(xiàn)在結(jié)果中,不然就會(huì)出錯(cuò),沒有結(jié)果。實(shí)際上,第一次調(diào)用這個(gè)函數(shù)過濾器,傳入的鍵是一個(gè)空字符串,而值就是student對(duì)象。上面的jsonText的值如下:
{"name":"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
在內(nèi)部是按順序遍歷每一個(gè)對(duì)象每一個(gè)屬性,所以公開key,value函數(shù)方法需要注意你的函數(shù)只有著兩個(gè)參數(shù)才能起效,要理解函數(shù)的目的,就是在內(nèi)部機(jī)制遍歷每一個(gè)屬性的時(shí)候讓你來修改部分結(jié)果,并且是一次遍歷每一個(gè)對(duì)象,這樣在序列化對(duì)象中每一個(gè)對(duì)象都要經(jīng)過過濾器。
2、字符串縮進(jìn)
JSON.stringify()方法的第三個(gè)參數(shù)用于控制結(jié)果中的縮進(jìn)和空白符。如果這個(gè)參數(shù)是一個(gè)數(shù)值,那么它表示的是每個(gè)級(jí)別縮進(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="測(cè)試" />
</body>
</html>
保存在jsonText中的字符串為:
復(fù)制代碼 代碼如下:
{
"name": "Bill",
"age": 12,
"grade": 3,
"id": "0802020114",
"subject": [
"math",
"Chinese",
"English"
]
}
JSON.stringify()在結(jié)果字符串中插入了換行符以提高可讀性。只要傳入有效的控制縮進(jìn)的參數(shù)值,結(jié)果字符串就會(huì)包含換行符(只縮進(jìn)而不換行意義不大)。最大縮進(jìn)空格數(shù)位10,所有大于10的值都會(huì)自定轉(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"
*]
}
同樣字符串最長(zhǎng)不能超過10個(gè)字符長(zhǎng)。如果超過,結(jié)果中將只出現(xiàn)10個(gè)字符。
3、toJSON()方法
有時(shí)候JSON.stringify()還是不能滿足對(duì)某些對(duì)象進(jìn)行自定義序列化的需求。在這些情況下,可以通過對(duì)象上調(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="測(cè)試" />
</body>
</html>
以上代碼在student對(duì)象上定義了一個(gè)toJSON()方法,該方法返回name和id的組合。最后jsonText的值如下:
"Bill_0802020114"
toJSON()可以作為函數(shù)過濾器的補(bǔ)充,因此理解序列化的內(nèi)部順序十分重要。假設(shè)把一個(gè)對(duì)象傳入JSON.stringify(),序列化該對(duì)象的順序是:
(1)如果存在toJSON()方法而且能夠通過它取得有效值,則調(diào)用該方法。否則,按默認(rèn)順序執(zhí)行序列化。
(2)如果提供了第二個(gè)參數(shù),應(yīng)用這個(gè)函數(shù)過濾器。傳入函數(shù)過濾器的值是第(1)步返回的值。
(3)對(duì)第(2)步返回的每個(gè)值進(jìn)行相應(yīng)的序列化。
(4)如果提供了第三個(gè)參數(shù),執(zhí)行相應(yīng)的格式化。
無論是考慮滴定toJSON()方法,還是考慮使用函數(shù)過濾器,或者需要同時(shí)使用兩者,理解這個(gè)順序都是至關(guān)重要的。
您可能感興趣的文章:
- JSON PHP中,Json字符串反序列化成對(duì)象/數(shù)組的方法
- PHP中SERIALIZE和JSON的序列化與反序列化操作區(qū)別分析
- PHP的serialize序列化數(shù)據(jù)以及JSON格式化數(shù)據(jù)分析
- php json與xml序列化/反序列化
- php 中序列化和json使用介紹
- php中serialize序列化與json性能測(cè)試的示例分析
- js解析與序列化json數(shù)據(jù)(一)json.stringify()的基本用法
- jquery序列化form表單使用ajax提交后處理返回的json數(shù)據(jù)
- Json序列化和反序列化方法解析
- php中json?序列化為?[]?的弊端
相關(guān)文章
JSON與XML優(yōu)缺點(diǎn)對(duì)比分析
本文從各個(gè)方面向大家對(duì)比展示了json和xml的優(yōu)缺點(diǎn),十分的全面細(xì)致,有需要的小伙伴可以參考下。2015-07-07json解析大全 雙引號(hào)、鍵值對(duì)不在一起的情況
這篇文章主要介紹了json解析大全 雙引號(hào)、鍵值對(duì)不在一起的情況,需要的朋友可以參考下2019-12-12如何實(shí)現(xiàn)json數(shù)據(jù)可視化詳解
最近在工作中開發(fā)一個(gè)內(nèi)部功能時(shí)碰到的一個(gè)需求,要把json數(shù)據(jù)在頁面上展示出來,平時(shí)瀏覽器會(huì)安裝jsonView這樣的擴(kuò)展來看json數(shù)據(jù),但是程序要用到的話該怎么辦呢?今天在網(wǎng)上搜索的時(shí)候,發(fā)現(xiàn)了這個(gè)小技巧,分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧2016-11-11