JavaScript JSON——「語法、解析與序列化」的注意要點

語法

JSON能夠表示一下三種類型的值:javascript

  • 簡單值:使用與js相同的語法能夠在json中表示字符串、數值、布爾值和null。可是json不支持js的undefinedjava

  • 對象:對象做爲一種複雜的數據類型,表示的是一組有序的鍵值對。每一個鍵值對的值能夠是簡單值,也能夠是複雜數據類型的值git

  • 數組:數組也是一種複雜數據類型,表示一組有有序的的值列表,能夠經過數值索引來訪問其中的值。數組的值也能夠是任意類型,簡單值,對象,數組都可。github

json不支持變量,函數,對象實例,它就是一種表示結構化數據的格式。json

簡單值

js字符串與json最大的區別在於json字符串必須使用雙引號,單引號會致使語法錯誤。數組

對象

js中的對象:瀏覽器

var person = {
    name: "oliver",
    age:29
};

但在JSON中屬性須要加上雙引號數據結構

{
    "name": "oliver",
    "age": 29
}

而且沒有聲明變量;沒有末尾的分號。絕對不能在同一個對象中出現兩個同名屬性。函數

數組

js中的數組:this

var values = [321,"Oliver",false]

JSON中的數組:

[321,"Oliver",false]

JSON中沒有變量和分號。

解析與序列化

JSON對象

json流行的最主要的緣由是由於json數據結構能夠解析爲js的對象。早期的json解析器基本上是使用js的eval()函數。對於較早版本的瀏覽器,可使用一個shim:https://github.com/douglacrockford/JSON-js。對於那些不能原生支持JSON解析的瀏覽器,使用shim是最佳選擇。ECMAScript 5對解析JSON的行爲進行了規範,定義了全局對象JSON。

JSON對象有兩個方法:

  • stringify()

  • parse()

在最簡單的狀況下,這兩個方法分別用於把javascript對象序列化爲JSON字符串和把JSON字符串解析爲原聲的javascript值。

如(JSON.stringify()):

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    other: undefined //被忽略
};

var jsontext = JSON.stringify(book);

console.log(jsontext); //{"title":"javascript","authors":["oliver","troy"],"edition":2,"year":2000}

又如(JSON.parse()):

var anotherBook = JSON.parse(jsontext);
console.log(Object.keys(anotherBook).toString()); //title,authors,edition,year

序列化選項

JSON.stringify()除了要序列化的Javascript對象外,還能夠接收另外兩個參數,這兩個參數用於指定以不一樣方式序列化javascript對象。

第一個參數是一個過濾器,能夠是一個數組,也能夠是一個函數

第二個參數是一個選項,表示是否在JSON字符串中保留縮進。單獨或組合使用這兩個參數,能夠全面化的控制JSON序列化。

過濾結果

JSON.stringify()的第二個參數是一個數組。在返回結果中,只會包含這些屬性。

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    other: undefined //被忽略
};
var jsontext = JSON.stringify(book,["title","authors"]);
console.log(jsontext); //{"title":"javascript","authors":["oliver","troy"]}

若是第二個參數是函數,傳入的函數接收兩個參數,屬性名屬性值(function (key,value))。

根據屬性名能夠知道應該如何處理序列化的對象中的屬性。屬性名只能是字符串,而在值並不是鍵值對結構的值時,鍵名能夠是空字符串。爲了改變序列化對象的結果,函數返回值就是相應鍵的值。若是返回undefined做爲屬性值,則表示跳過這個屬性。

如:

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    other: undefined //被忽略
};
var jsontext = JSON.stringify(book,function (key,value) {
    switch (key) {
        case "authors":
            return value.join("-");
            break;
        case "edition":
            return undefined;
            break;
        default:
            return value;
    }
});
console.log(jsontext); //{"title":"javascript","authors":"oliver-troy","year":2000}

字符串縮進

當JSON.stringify()的第三個參數是用於控制結果中的縮進和空白符。若是這個參數是一個數值,表示是每一個級別縮進的空格數。

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    other: undefined //被忽略
};
var jsonText = JSON.stringify(book,null,4);
var pre = document.getElementById("pre");
pre.innerHTML = jsonText;
// {
//     "title": "javascript",
//     "authors": [
//         "oliver",
//         "troy"
//     ],
//     "edition": 2,
//     "year": 2000
// }

最大的縮進空格數是10,超過10,則設定爲10.

若是縮進字符串是一個字符串而非數值,則在這個字符串將在JSON字符串中被用做縮進字符。縮進字符串最多也只出現10個字符長度。

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    other: undefined //被忽略
};
var jsonText = JSON.stringify(book,null,"----");
var pre = document.getElementById("pre");
pre.innerHTML = jsonText;
// {
// ----"title": "javascript",
// ----"authors": [
// --------"oliver",
// --------"troy"
// ----],
// ----"edition": 2,
// ----"year": 2000
// }

toJSON()方法

toJSON()方法,爲任何對象添加,它會在對象被序列化是調用,返回指定的數據,而不是整個對象的序列化數據。

toJSON()方法能夠做爲函數過濾器的補充,所以理解序列化內部順序十分重要。假設把一個對象傳入JSON.stringify(),序列化該對象的順序以下:

  1. 若是存在toJSON()方法並且能經過它取得有效地值,則調用該方法。不然按照默認順序執行序列化。

  2. 若是提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第一步的返回值。

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

  4. 若是提供了第三個參數,執行相應的格式化

如:

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    toJSON: function () {
        return this.title + this.edition; //javascript2
    },
    other: undefined //被忽略
};
var jsonText = JSON.stringify(book);
console.log(jsonText); //javascript2

解析選項

JSON.parse()方法也能夠接收另外一個參數,該參數是一個函數,將在每一個鍵值對上調用。

這個函數被稱爲還原函數,它與JSON.stringify()方法中的過濾函數有些類似,都接收鍵值對,返回一個值。若是還原函數返回undefined,則表示要從結果中刪除相應的鍵,若是返回其餘值,則將改值插入到結果中。

var book = {
    title: "javascript",
    authors: ["oliver", "troy"],
    edition: 2,
    year: 2000,
    date: new Date(2001, 1, 1),
    other: undefined //被忽略
};
var jsonText = JSON.stringify(book);
console.log(jsonText); //{"title":"javascript","authors":["oliver","troy"],"edition":2,"year":2000,"date":"2001-01-31T16:00:00.000Z"}
var anotherbook = JSON.parse(jsonText, function(key, value) {
    switch (key) {
        case "date":
            return new Date(value);
            break;
        default:
            return value;
            break;
    }
})
相關文章
相關標籤/搜索