标准库之JSON对象

  1. JSON格式

    每个JSON对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值,只能是一个值,不能是两个或更多的值.

    JSON 对值的类型和格式有严格的规定

    1. 复合类型的值只能是数组或者对象,不能是函数/正则表达式对象/日期对象.

    2. 原始类型的值只有四种: 字符串/数值(十进制)/布尔值和null,

      不能使用Nan , Infinity, -Infinity , undefined

    3. 字符串必须使用双引号表示,不能使用单引号.

    4. 对象的键名必须放在双引号里面.

    5. 数组或对象最后一个成员的后面 , 不能加逗号.

    以下是合法JSON

    ["one","two","three"]
    {"one":1,"two":2,"three":3}
    {"names":["张三","李四"]
    

    以下都是不合法的 JSON。

    { name: "张三", 'age': 32 }  // 属性名必须使用双引号
    
    [32, 64, 128, 0xFFF] // 不能使用十六进制值
    
    { "name": "张三", "age": undefined } // 不能使用 undefined
    
    { "name": "张三",
      "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
      "getName": function () {
          return this.name;
      }
    } // 属性值不能使用函数和日期对
    
  2. JSON对象

    是JS的原生对象,用来处理JSON格式数据.它有两个静态方法:

    JSON.stringify( ) and JSON.parse( );

    JSON.stringify( )

    该方法用于将一个值转换为符合JSON格式字符串,此字符串可以被JSON.parse 方法还原.

    • 注意,对于原始类型字符串,转换结果会带双引号.
    JSON.stringify('foo') // "\"foo\""
    
    • 如果对象的属性是 undefined 函数或者XML对象,该属性会被JSON.stringify 过滤.
    var obj = {
      a:undefined,
      b:function(){}
    }
    JSON.stringify(obj) // "{}"
    
    • 如果数组的成员是 undefined 函数或 XML对象 ,则这些值会被转成null.

      var arr = [undefined,function(){}];
      JSON.stringify(arr) //"[null,null]"
      
    • 正则对象会被转换成空对象

      JSON.stringify(/foo/) //"{}"
      
    • JSON.stringify 方法会忽略对象的不可遍历属性

      var obj = {};
      Object.defineProperties(obj,{
        'foo':{
          value:1,
          enumerable:true
        },
        'bar':{
          value:2,
          enumerable:false
        }
      });
      
      JSON.stringify(obj); // "{"foo":1}"
      
    • JSON.stringify方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。

      var obj = {
        'prop1': 'value1',
        'prop2': 'value2',
        'prop3': 'value3'
      };
      
      var selectedProperties = ['prop1', 'prop2'];
      
      JSON.stringify(obj, selectedProperties)
      // "{"prop1":"value1","prop2":"value2"}"
      

      上面代码中,JSON.stringify方法的第二个参数指定,只转prop1prop2两个属性。

      但是此规则只适用于对象的属性

    • 第二个参数还可以是一个函数,用来更改JSON.stringify的返回值。

      function f(key, value) {
        if (typeof value === "number") {
          value = 2 * value;
        }
        return value;
      }
      
      JSON.stringify({ a: 1, b: 2 }, f)
      // '{"a": 2,"b": 4}'
      
      
    • 第三个参数

      JSON.stringify还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格数目(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。

      JSON.stringify({ p1: 1, p2: 2 }, null, 2);
      /*
      "{
        "p1": 1,
        "p2": 2
      }"
      */
      
      JSON.stringify({ p1:1, p2:2 }, null, '|-');
      /*
      "{
      |-"p1": 1,
      |-"p2": 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.parse( )

    如果传的字符串不是有效的JSON格式, 该方法会报错.

    为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中。

    try {
      JSON.parse("'String'");
    } catch(e) {
      console.log('parsing error');
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值