首頁 > web前端 > js教程 > 主體

js解析與序列化json資料(二)序列化探討_json

WBOY
發布: 2016-05-16 17:42:18
原創
996 人瀏覽過

上一節我們解釋了JSON.stringify()的基本用法,這一節我們來重點探討一下序列化。
JSON.stringify()除了要序列化的js物件外,還可以接收另外兩個參數,這兩個參數用於指定不同方式序列化js物件。第一個參數是過濾器,可以使一個數組,也可以是一個函數;第二個參數是一個選項,表示是否在JSON字串中保留縮排。單獨或組合使用這兩個參數,可以更全面深入地控制JSON的序列化。
1、過濾結果
如果過濾器參數是數組,那麼JSON.stringify()的結果中將只包含數組中列出的屬性。如:

複製代碼 代碼如下:











jsonText的值為
{"name":"Bill","id":"802020114"}
如果第二個參數是函數,行為會有一點不同。傳入的函數接收兩個參數,屬性(鍵)名稱和屬性值。根據屬性(鍵)名稱可以知道應該如何處理要序列化的物件中的屬性。屬性名只能是字串。
為了改變序列化物件的結果,函數傳回的值就是對應鍵的值。不過要注意,如果函數回傳了undefined,那麼對應的屬性就會被忽略。如:
複製代碼 代碼如下:











這裡函數過濾器根據傳入的鍵來決定結果。如果鍵為name,就將其值設為Lily;如果為grade就返回undefined來刪除該屬性;如果為subject,它是一個數組,就將它通過數組方法join()轉換為以逗號連接的字符串。最後一定要提供default項,讓其他的值都能夠正常出現在結果中,不然就會出錯,沒有結果。實際上,第一次呼叫這個函數過濾器,傳入的鍵是一個空字串,而值就是一個student物件。上面的jsonText的值如下:
{"name":"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
在內部是依序遍歷每一個物件每一個屬性,所以公開key,value函數方法要注意你的函數只有著兩個參數才能起效,要理解函數的目的,就是在內部機制遍歷每一個屬性的時候讓你來修改部分結果,並且是一次遍歷每一個對象,這樣在序列化對像中每一個對像都要經過過濾器。
2、字串縮排
JSON.stringify()方法的第三個參數用來控制結果中的縮排和空格符。如果這個參數是一個數值,那麼它表示的是每個層級縮排的空格數。如:
複製代碼 代碼如下:











儲存在jsonText的字串為:
複製程式碼 程式碼如下:


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


JSON.stringify()在結果字串中插入了換行符以提高可讀性。只要傳入有效的控制縮排的參數值,結果字串就會包含換行符號(只縮排而不換行意義不大)。最大縮排空格數字10,所有大於10的值都會自訂轉換為10。

如果縮排參數是一個字串而非數值,則這個字串將在JSON字串中被用作縮排字元(不再使用空格)。如可達到以下的效果: 程式碼如下:


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


同樣字串最長不能超過10個字元長。如果超過,結果中只會出現10個字元。

3、toJSON()方法

有時候JSON.stringify()還是無法滿足對某些物件進行自訂序列化的需求。在這些情況下,可以透過物件上呼叫toJSON()方法,傳回其自身的JSON資料格式。如:




複製代碼


代碼如下:





grade:3,
id:"0802020114",
subject:["math","Chinese","English"],
toJSON:function(){
return this.name "_" this.id;
}
};
var jsonText=JSON.stringify(student);
} 以上程式碼在student物件上定義了一個toJSON()方法,該方法傳回name和id的組合。最後jsonText的值如下: "Bill_0802020114" toJSON()可以作為函數過濾器的補充,因此理解序列化的內部順序十分重要。假設把一個物件傳入JSON.stringify(),序列化該物件的順序是: (1)如果存在toJSON()方法而且能夠透過它取得有效值,則呼叫該方法。否則,按預設順序執行序列化。 (2)如果提供了第二個參數,請應用這個函數濾波器。傳入函數過濾器的值是第(1)步驟傳回的值。 (3)對第(2)步驟傳回的每個值進行對應的序列化。 (4)如果提供了第三個參數,執行對應的格式化。 無論是考慮滴定toJSON()方法,還是考慮使用函數過濾器,或者需要同時使用兩者,理解這個順序都是至關重要的。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板