跳至正文

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 教程,有修改。

标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注