1. 程式人生 > >JavaScript教程筆記(18)-JSON物件

JavaScript教程筆記(18)-JSON物件

1 什麼是JSON

JSON(JavaScript Object Notation)是一種用於資料交換的文字格式,目的是取代繁瑣笨重的XML格式。JSON格式提出後,被迅速接受,併成為各大網站交換資料的標準格式。

JSON格式有兩個顯著優點:

  • 書寫簡單,一目瞭然;
  • 符合JavaScript原生語法,由解釋引擎直接處理,無需額外解析程式碼。

每個JSON物件就是一個值,可以是一個原始型別的值,也可以是陣列或物件。它有以下規定。

  1. 複合型別的值只能是陣列或物件,不能是函式、正則表示式物件、日期物件。
  2. 原始型別的值只有四種:字串、數值(必須以十進位制表示)、布林值和null
    (不能使用NaNundefined)。
  3. 字串必須使用雙引號表示,不能使用單引號。
  4. 物件的鍵名必須放在雙引號裡面。
  5. 陣列或物件的最後一個成員後面,不能加逗號。

以下都是合法的JSON。

[ "one", "two", "three"]
{ "name": null }
{ "name": "小張", "age": 20 }
{ "name": ["小張", "小李"]}

以下都是不合法的JSON。

{ name: "小張", 'age': 20 } // 屬性名必須使用雙引號
{ "name": "小張", "getName": function() {
    return this.name;
    }
} // 屬性值不能使用函式

注意,null、空陣列和空物件都是合法的JSON值。

2 JSON物件

JSON物件是JavaScript的原生物件,有兩個靜態方法:JSON.stringify()JSON.parse()

3 JSON.stringify()

3.1 基本用法

JSON.stringify()用於將一個值轉化JSON字串。該字串將符合JSON格式,並且可以被JSON.parse方法還原。

JSON.stringify('abc') // ""abc""
JSON.stringify([]) // "[]"
JSON.stringify({name:"小張"}) // '{"name":"小張"}'

上面程式碼將各種型別的值,轉成JSON字串。

如果物件的屬性是undefined、函式或XML物件,該屬性會被JSON.stringify過濾。

var obj = {
    a: undefined,
    b: function() {}
};

JSON.stringify(obj) // "{}"

3.2 引數物件的toJSON方法

如果引數物件有自定義的toJSON方法,那麼JSON.stringify會使用這個方法的返回值作為引數,而忽略該物件的其它屬性。

先看一個普通物件。

var user = {
    firstName: '三',
    lastName: '張',
    
    get fullName() {
        return this.lastName + this.firstName;
    }
};

JSON.stringify(user)
// "{"firstName":"三","lastName":"張","fullName":"張三"}"

現在,為這個物件加上toJSON方法。

var user = {
    firstName: '三',
    lastName: '張',
    
    get fullName() {
        return this.lastName + this.firstName;
    }
    
    toJSON: function() {
        return {
            name: this.lastName + this.firstName
        };
    }
};

JSON.stringify(user)
// "{"name":"張三"}"

上面程式碼中,JSON.stringify發現引數物件有toJSON方法,就直接使用這個方法的返回值作為引數了。

JSON.stringify預設不能轉換正則物件,但是通過 toJSON方法就可以轉換了。

var obj = {
  reg: /foo/
};

// 不設定 toJSON 方法時
JSON.stringify(obj) // "{"reg":{}}"

// 設定 toJSON 方法時
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""

4 JSON.parse()

JSON.parse方法用於將JSON字串轉換成對應的值。

JSON.parse('{}') // {}
JSON.parse('true') // true

var obj = JSON.parse('{"name": "張三"}');
obj.name // 張三

如果傳入字串不是有效的JSON格式,將會報錯。

JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL

上面程式碼中,因為單引號字串不符合JSON格式,所以報錯。

為了處理解析錯誤,可以將JSON.parse方法放在try...catch程式碼塊中。

try {
    JSON.parse("'String'");
} catch(e) {
    console.log('parsing error');
}

注:本文適用於ES5規範,原始內容來自 JavaScript 教程,有修改。