(77)Wangdao.com第十五天_JavaScript 用于数据交换的文本格式 JSON 对象

JSON 对象正则表达式

JSON (JavaScript Object Notation 的缩写)json

也是一种数据,是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify() 和  JSON.parse()数组

是一种无序的属性名和属性值的集合,用于网站的先后台交互。函数

  • 在先后台交互的时候,虽然数据的格式是 json,但要用字符串的形式进行传递
  • 发送时,使用 JSON.stringify( json对象 ) 将 json 对象转换成字符串。
  • 接收时,用 JSON.parse(字符串形式的 json ) 解析成 json 对象。
    var p = {
        name: '周杰伦',
        age: 40
    };
    
    var jsonObj = { "name":"陶喆", "age":"45", "gender":"true", }; 
    // 发送
    var jsonStr = JSON.stringify(jsonObj); //

    // 接收
    var jsonObj = JSON.parse(jsonStr); //

    // for...in...遍历 json对象
    for var k in jsonObj{
    console
    }

     

  • JSON 格式是用于数据交换的文本格式
    • 2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。
    • JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。
    • 目的是取代繁琐笨重的 XML 格式。
    • 两个显著的优势:
      • 书写简单,一目了然;
      • 符合 JavaScript 原生语法,能够由解释引擎直接处理,不用另外添加解析代码。

 

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

 

  • JSON 对值的类型和格式有严格的规定
    • 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
    • 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)
    • 字符串必须使用双引号表示,不能使用单引号
    • 对象的键名必须放在双引号里面
    • 数组或对象最后一个成员的后面,不能加逗号

 

  • JSON.stringify()
    • 第一个参数为JSON对象,将转为 ' JSON 字符串' 。该字符串符合 JSON 格式,而且能够被 JSON.parse 方法还原
    • 第一个参数若是是原始类型的字符串,结果会带双引号,转换为 "JSON字符串"。
      • 这是由于未来还原的时候,内层双引号可让 JavaScript 引擎知道,这是一个字符串,而不是其余类型的值
        JSON.stringify('foo') === "foo"     // false
        JSON.stringify('foo') === "\"foo\""     // true
        //字符串foo,被转成了"\"foo"\"。
        // 这是由于未来还原的时候,内层双引号可让 JavaScript 引擎知道,这是一个字符串,而不是其余类型的值
        
        
        JSON.stringify(false);     // "false"
        // 因为没有内层双引号,因此原始值是布尔,而不是字符串
        
        JSON.stringify('false');     // "\"false\""

         

    • 若是对象属性值是 undefined、函数或 XML 对象,该属性会 JSON.stringify 过滤
    • 若是数组成员undefined、函数或 XML 对象,则这些值被转成 null
    • 正则对象会被转成空对象    JSON.stringify(/foo/)        // "{}"
    • 会忽略对象的不可遍历的属性
      • var obj = {};
        Object.defineProperties(obj, {
            'foo': {
                value: 1,
                enumerable: true
            },
            'bar': {
                value: 2,
                enumerable: false
            }
        });
        
        JSON.stringify(obj);    // "{"foo":1}"

         

    • 还能够接受接受一个数组,做为第二个参数,指定须要转成字符串的属性。。。只对对象的属性有效,对数组无效
      • 指定要解析的属性
        • var obj = {
              'prop1': 'value1',
              'prop2': 'value2',
              'prop3': 'value3'
          };
          
          var selectedProperties = ['prop1', 'prop2'];
          
          JSON.stringify(obj, selectedProperties);   //{"prop1":"value1","prop2":"value2"}"

           

    • 第二个参数还能够是一个函数,用来更改 JSON.stringify 的返回值
    • 函数,接受两个参数,分别是被转换的对象的键名和键值
    • 递归处理全部的键。每次递归处理前一次修改后的对象
    • 若是处理函数返回undefined或没有返回值,则该属性会被忽略o
      • 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 字符串的可读性。
      • 若是是数字,表示每一个属性前面添加的空格(最多不超过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
          }"
          */

           

    • 第一个参数,即JSON对象,若是含有 toJSON() 方法,则直接使用这个方法的返回值做为参数,而忽略原对象的其余参数
    • Date 就拥有本身的 toJSON() 方法
    • toJSON方法的一个应用是,将正则对象自动转为字符串。JSON.stringify默认不能转换正则对象,可是设置了toJSON方法之后,就能够转换正则对象了
      var obj = {
        reg: /foo/
      };
      
      // 不设置 toJSON 方法时
      JSON.stringify(obj) // "{"reg":{}}"
      
      // 设置 toJSON 方法时
      RegExp.prototype.toJSON = RegExp.prototype.toString;
      JSON.stringify(/foo/) // ""/foo/""

       

  • JSON.parse()
    • 用于将 JSON 字符串转换成对应的值
    • 若是传入的字符串不是有效的 JSON 格式,JSON.parse方法将报错
    • 为了处理解析错误,能够将JSON.parse方法放在try...catch代码块中
      • try {
            JSON.parse("'String'");
        } catch(e) {
            console.log('parsing error');
        }

         

    • 能够接受一个处理函数,做为第二个参数,用法与JSON.stringify方法相似
      • function f(key, value) {
            if (key === 'a') {
                return value + 10;
            }
            return value;
        }
        
        JSON.parse('{"a": 1, "b": 2}', f);    // {a: 11, b: 2}
相关文章
相关标签/搜索