1. 程式人生 > 實用技巧 >JavaScript:JSON

JavaScript:JSON

JSON是一種資料格式,它並不從屬於JavaScript,很多語言都有JSON的解析器和序列化器。

語法

JSON可以表示三種類型:

  • 簡單值:使用與JavaScript相同的語法,可以在JSON中表示字串、數值、布林值和null。
  • 物件:表示一組無序的鍵值對。鍵值對中的值可以是簡單值,也可以是複雜資料型別。
  • 數值:表示一組有序的值的列表,陣列的值可以是任意型別。

JSON不支援變數、函式或物件例項,是一種表示結構化資料的格式。

簡單值

JSON資料形式:

5    // 數值
"Hello JavaScript"    // 字串
null

物件

與JavaScript不同,JSON中的物件要求給屬性加上引號

{
    "name": "蕭蕭弈寒";
    "age": 100
}

// 屬性的值也可以是複雜型別
{
    "school": {
        "name": "hafo", 
        "location": "Harbin"
    }
}

陣列

JSON表示陣列:

[100, "蕭蕭弈寒", true]

JSON陣列沒有變數和分號。

把陣列和物件結合,可以構造複雜的資料集合:

[
    {
        "title":"Java從入門到放棄",
        "authors":[
            "張三"
        ],
        edition: 2
    },
    {
        "title":"MySQL從刪庫到跑路",
        "authors":[
            "李四"
        ],
        edition: 3
    },
    {
        "title":"Dreamweaver從安裝到解除安裝",
        "authors":[
            "王五"
        ],
        edition: 4
    }
]

解析與序列化

JSON物件

JSON物件有兩個方法:

  • stringfy():把JavaScript物件序列化為JSON字串
  • parse():。把JSON字串解析為原生JavaScript值

示例:

var book = {
    "title":"Java從入門到放棄",
    "authors":[
        "張三"
    ],
    edition: 2
};
var jsonText = JSON.stringify(book);
alert(jsonText);    // {"title":"Java從入門到放棄","authors":["張三"],"edition":2}

上面的例子將一個JavaScript物件序列化為一個JSON字串。預設情況下,JSON.stringify()不包含任何字元或縮排。

將JSON字串直接傳遞個JSON.parse()可以得到相應的JavaScript值。

var newBook = JSON.parse(jsonText);    

book與newBook具有相同的屬性,但是彼此是相互獨立的。

序列化選項

JSON.stringify()還可以接收兩個引數:

  • 第一個引數:過濾器,一個數組或一個函式。
  • 第二個引數:一個選項,表示是否在JSON字串中保留縮排

過濾結果

如果引數是陣列,JSON.stringify()的結果只包含陣列中列出的屬性。

var book = {
    "title":"Java從入門到放棄",
    "authors":[
        "張三"
    ],
    edition: 2
};
var jsonText = JSON.stringify(book, ["title", "authors"]);
console.log(jsonText);  // {"title":"Java從入門到放棄","authors":["張三"]}

如果引數是函式,傳入的函式接收兩個引數,屬性名和屬性值,根據屬性名可以知道如何處理屬性。屬性名是字串,屬性值並非鍵值對的值,鍵名可以是空字串。

返回的值是相應鍵的值,如果函式返回undefined,那麼該屬性就會被忽略。

var book = {
    "title":"Java programming",
    "authors":[
        "張三",
        "李四"
    ],
    edition: 2
};
var jsonText = JSON.stringify(book, function (key, value) {
    switch (key) {
        case "authors":
            return value.join("-");        // 用“-”分割陣列
        case "edition":
            return undefined;
        default :
            return value;
    }
});
console.log(jsonText);    // {"title":"Java programming","authors":"張三-李四"}

字串縮排

JSON.stringify()的第三個引數用於控制結果中的縮排和空白符。如果是數值,表示每格縮排的空格數。

var book = {
    "title":"Java programming",
    "authors":[
        "蕭蕭弈寒",
    ],
    edition: 2
};
var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText);

如果是字串,這個字串將用作JSON字串的縮排符

var book = {
    "title":"Java programming",
    "authors":[
        "蕭蕭弈寒",
    ],
    edition: 2
};
var jsonText = JSON.stringify(book, null, "__");
console.log(jsonText);

【顯示結果】:

{
__"title": "Java programming",
__"authors": [
____"蕭蕭弈寒"
__],
__"edition": 2
}

縮排字串最多隻能包含10個字元。

toJSON()方法

JSON.stringify()並不能滿足所有物件進行序列化的需求。可以給物件定義toJSON()方法,返回其自身的JSON資料格式。

示例:

var book = {
    "title":"Java programming",
    "authors":[
        "蕭蕭弈寒",
    ],
    edition: 2,
    toJSON: function () {
        return "==="+this.title+"===";
    }
};
var jsonText = JSON.stringify(book);
console.log(jsonText);    // "===Java programming==="

解析選項

JSON.parse()方法也可以接收另一個引數,該引數是一個函式,將在每個鍵值對上呼叫。如果返回undefined,表示從結果中刪除相應的鍵,如果返回其他值,則將該值插入到結果中。

var book = {
    "title":"Java programming",
    "authors":[
        "蕭蕭弈寒",
    ],
    edition: 2,
    year: 2017,
    releaseDate: new Date(2017, 11, 1)
};
var jsonText = JSON.stringify(book);

var newBook = JSON.parse(jsonText, function (key, value) {
    if (key == "releaseDate") {
        return new Date(value);
    } else {
        return value;
    }
});
console.log(newBook.releaseDate.getFullYear());    // 2017

上面新增了releaseDate屬性,該屬性儲存著一個Date物件。經過序列化後,變成了一個有效的JSON字串,然後又在newBook中還原成一個Date物件。