高級程序設計之JSON語法、序列化講解

一、前言

JSON是JavaScript的一個嚴格的子集,利用瞭JavaScript中的一些模式來表示結構化數據 JSON是一種數據格式,不是一種編程語言 雖然具有相同的語法形式,但JSON並不從屬於JavaScript

二、語法

JSON的語法可以表示三種類型 簡單值:使用與JavaScript相同的語法,可以在JSON中表示字符串、數值、佈爾值和null。但JSON不支持JavaScript中的特殊值undefined 對象:對象作為一種復雜數據類型,表示的是一組無序的鍵值對。每個鍵值對中的值可以是簡單值、復雜數據類型的值 數組:復雜數據類型,表示一組有序的值的列表,可以通過數值索引來訪問其中的值。數組的值也可以是任意類型:簡單值、對象、數組 JSON不支持變量、函數或對象實例

1.簡單值

JSON字符串必須使用雙引號 佈爾值和null也是有效的JSON形式

2.對象

沒有變量聲明 沒有末尾的分號 對象的屬性必須加雙引號 同一個對象中絕對不應該出現兩個同名屬性

{
    "name":"Nicholas",
    "age":29,
    "school":{
        "name":"mary",
        "location":"north"
    }
}

3.數組

同樣沒有變量和分號 對象和數組通常是JSON數據結構的最外層形式(當然,這不是強制規定的),利用他們能創造出各種各樣的數據結構

{
    "title":"hello",
    "authors":["jack",29],
    "edition":3,
    "year":2011
}

三、解析與序列化

可以把JSON數據結構解析為有用的JavaScript對象

2.使用方便

1.JSON對象

全局對象JSON。這個對象有2個方法 stringify()

用於把JavaScript對象序列化為JSON字符串 默認情況下返回的字符串不包含任何空格字符或縮進 在序列化JavaScript對象時,所有函數及原型成員都會被有意忽略,不體現在結果中。此外,值為undefined的任何屬性也會被跳過,結果中最終都是有效JSON數據類型的實例屬性 parse()

把JSON字符串解析為原生JavaScript值 通過parse()返回的JavaScript與傳入stringify()的JavaScript雖然具有相同的屬性,但沒有什麼關系

var book={
    title:"hello",
    authors:["jack",29],
    edition:3,
    year:2011
};
var jsontext=JSON.stringify(book);
var bookcopy=JSON.parse(jsontext);

2.序列化選項

JSON.stringify()還可以接受兩外兩個參數 第一個參數是個過濾器:數組/函數

數組,則方法返回的結果中隻包含數組中列出的屬性

JSON.stringify(book,["title"]),則返回的字符串中隻包含title這個屬性{"title":"hello"} 函數,接收兩個參數:屬性名和屬性值

屬性名隻能是字符串,而在值並非鍵值對結構的值時,鍵名可以是空字符串 如果函數返回瞭undefined,那麼相應的屬性會被刪除

第二個參數是一個選項,用於控制結果中的縮進和空白符

如果這個參數是一個數值,那它表示的是每個級別縮進的空格數 如果這個參數是一個字符串而非數值,則這個字符串將在JSON字符串中被用作縮進字符(不再使用空格) 隻要傳入有效的控制縮進的參數值,結果字符串就會包含換行符 縮進的數值不能超過10,如果大於10就會自動轉換為10 縮進的字符串最長不能超過10個字符串,如果超過,結果中將隻出現前10個字符

var jsontext=JSON.stringify(book,null,4);
var jsontext1=JSON.stringify(book,null,"--");

可以給對象定義toJSON()方法,返回其自身的JSON數據格式

原生Date對象有一個toJSON()方法,能夠將JavaScript的Date對象自動轉換成ISO 8601日期字符串(與在Date對象上調用toISOSstring()的結果完全一樣) 可以為任何對象添加toJSON()方法 可以讓toJSON()方法返回任何值,他都能正常工作。如果返回undefined,此時如果包含它的對象嵌入在另一個對象中,會導致它的值變成null,二如果它是頂級對象,結果就是undefined。

var book={
    title:"hello",
    authors:["jack",29],
    edition:3,
    year:2011,
    toJSON:function(){
        return this.title;
    }
};
var jsontext=JSON.stringify(book);//"hello"

序列化對象的順序:

(1). 如果存在toJSON()方法而且能通過它取得有效的值,則調用該方法。否則,返回對象本身

(2). 如果提供瞭第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第(1)步返回的值

(3). 對第(2)步返回的每個值進行相應的序列化

(4). 如果提供瞭第三個參數,執行相應的格式化

3.解析選項

JSON.parse()方法也可以接收另一個參數,該參數是一個函數,將在每個鍵值對上調用。稱為還原函數 與過濾函數相似,傳入屬性名和屬性值,返回一個值

如果還原函數返回undefined,則表示要從結果中刪除相應的鍵;如果返回其他值,則將該值插入到結果中。

var book={
    title:"hello",
    authors:["jack",29],
    edition:3,
    year:2011,
    releaseDate:new Date(2011,11,1);
};
var jsontext=JSON.stringify(book);
var bookcopy=JSON.parse(jsontext,function(key,value){
    if(key=="releaseDate"){
        return new Date(value);
    }
    else{
        return value;
    }
});
alert(bookcopy.releaseDate.getFullYear());//2011

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *