第二十章 JSON

120 阅读2分钟

语法

JSON 字符串必须使用双引号

JSON 中的对象必须给属性加双引号

解析和序列化

解析

JSON.parse(),可接收2个参数:解析的 json 字符串、还原函数

  1. 还原函数

    接收两个参数,一个键和一个值,返回一个值。如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。

    var book = {
      "title": "Professional JavaScript",
      "authors": [
        "Nicholas C. Zakas"
      ],
      edition: 3,
      year: 2011,
      releaseDate: new Date(2020, 11, 1)
    };
    var jsonText = JSON.stringify(book);
    var bookCopy = JSON.parse(jsonText, function (key, value) {
      if (key == "releaseDate") {
        return new Date(value);
      } else {
        return value;
      }
    });
    alert(bookCopy.releaseDate.getFullYear()); //2020
    

序列化

JSON.stringify(),可接收3个参数:序列化的js对象、过滤器(可以为数组或者函数)、选项(表示是否在json字符串中保留缩进)

  1. 过滤结果

    如果过滤器是数组,那么 JSON.stringify() 的结果中将只包含数组中列出的属性。

    var book = {
      "title": "Professional JavaScript",
      "authors": [
        "Nicholas C. Zakas"
      ],
      edition: 3,
      year: 2011
    };
    var jsonText = JSON.stringify(book, ["title", "edition"]);
    
    //结果为:{"title":"Professional JavaScript","edition":3} 
    

    如果过滤器是函数,那么该函数接收两个参数:属性名、属性值,如果函数返回 undefined ,相应的属性会被忽略。

    var book = {
      "title": "Professional JavaScript",
      "authors": [
        "Nicholas C. Zakas"
      ],
      edition: 3,
      year: 2011
    };
    var jsonText = JSON.stringify(book, function (key, value) {
      switch (key) {
        case "authors":
          return value.join(",")
        case "year":
          return 5000;
        case "edition":
          return undefined;
        default:
          return value;
      }
    });
    
    //结果为:{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000} 
    
  2. 字符串缩进

    JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。如果缩进参数是一个字符串,则这个字符串将在 JSON 字符串中被用作缩进字符。缩进空格数和字符串最长都不能超过 10 个字符长,长度超过了 10 ,结果中将空格数为10或者只出现前 10 个字符。

    var jsonText1 = JSON.stringify(book, null, 4); 
    var jsonText2 = JSON.stringify(book, null, " - -"); 
    
    jsonText1为:
    { 
     	"title": "Professional JavaScript", 
     	"authors": [ 
     		"Nicholas C. Zakas" 
     	], 
     	"edition": 3, 
     	"year": 2011 
    } 
    
    jsonText2为:
    { 
    --"title": "Professional JavaScript", 
    --"authors": [ 
    ----"Nicholas C. Zakas" 
    --], 
    --"edition": 3, 
    --"year": 2011 
    } 
    
  3. toJSON() 方法

    可以为任何对象添加toJSON() 方法

    var book = {
      "title": "Professional JavaScript",
      "authors": [
        "Nicholas C. Zakas"
      ],
      edition: 3,
      year: 2011,
      toJSON: function () {
        return this.title;
      }
    };
    var jsonText = JSON.stringify(book); 
    

    假设把一个对象传入 JSON.stringify(),序列化该对象的顺序如下: (1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身 (2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值 (3) 对第(2)步返回的每个值进行相应的序列化 (4) 如果提供了第三个参数,执行相应的格式化