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ù)組中列出的屬性。如:
<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)的屬性會被忽略。如:
<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ù)。如:
<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中的字符串為:
{
"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)如下的效果:
{
*"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ù)格式。如:
<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)重要的。
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)重要的。
您可能感興趣的文章:
- JSON PHP中,Json字符串反序列化成對象/數(shù)組的方法
- PHP中SERIALIZE和JSON的序列化與反序列化操作區(qū)別分析
- PHP的serialize序列化數(shù)據(jù)以及JSON格式化數(shù)據(jù)分析
- php json與xml序列化/反序列化
- php 中序列化和json使用介紹
- php中serialize序列化與json性能測試的示例分析
- js解析與序列化json數(shù)據(jù)(一)json.stringify()的基本用法
- jquery序列化form表單使用ajax提交后處理返回的json數(shù)據(jù)
- Json序列化和反序列化方法解析
- php中json?序列化為?[]?的弊端
相關(guān)文章
詳解JSON1:使用TSQL查詢數(shù)據(jù)和更新JSON數(shù)據(jù)
這篇文章主要介紹了使用TSQL查詢數(shù)據(jù)和更新JSON數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11
把普通對象轉(zhuǎn)換成json格式的對象的簡單實(shí)例
下面小編就為大家?guī)硪黄哑胀▽ο筠D(zhuǎn)換成json格式的對象的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
使用JSON作為函數(shù)的參數(shù)的優(yōu)缺點(diǎn)
這篇文章主要介紹了使用JSON作為函數(shù)的參數(shù)的優(yōu)缺點(diǎn),需要的朋友可以參考下2016-10-10
json的定義、標(biāo)準(zhǔn)格式及json字符串檢驗(yàn)
今天分享和總結(jié)一些json的基本定義、格式、字符串的格式,以及在做測試的時(shí)候使用json時(shí)做一些簡單的校驗(yàn)2014-05-05
javascript表單域與json數(shù)據(jù)間的交互
找了幾個(gè)javascript的框架,都沒有找到我想要的: 提供函數(shù),把某個(gè)表單的所有域封裝成json數(shù)據(jù)格式的對象,唯有自己實(shí)現(xiàn)一個(gè)。2008-10-10
詳解Java中String JSONObject JSONArray List<實(shí)體類>轉(zhuǎn)換
這篇文章主要介紹了詳解String JSONObject JSONArray List<實(shí)體類>轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
javascript操作JSON的要領(lǐng)總結(jié)
JSON是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON數(shù)據(jù)不須要任何特殊的 API 或工具包,需要的朋友可以了解下2012-12-12

