美文网首页JavaScript < ES5、ES6、ES7、… >
JavaScript 高级程序设计(第20章 JSON)

JavaScript 高级程序设计(第20章 JSON)

作者: yinxmm | 来源:发表于2018-08-20 14:40 被阅读19次

第20章 JSON

1. 语法

JSON 的语法可以表示以下三种类型的值:

(1) 简单值:使用与 JavaScript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和 null。
但 JSON 不支持 JavaScript 中的特殊值 undefined。
(2) 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
(3) 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。

(1) 简单值

JavaScript 字符串与 JSON 字符串的最大区别在于,JSON 字符串必须使用双引号(单引号会导致语 法错误)。

(2) 对象

JSON 中的对象要求给属性加引号

// JavaScript 中的对象字面量
var person = {
        name: "Nicholas",
        age: 29
};
// JSON 表示上述对象
{
    "name": "Nicholas",
    "age": 29
 }

JavaScript 的对象字面量与JSON 对象不同处。
(1) 首先,没有声明变量(JSON 中没 有变量的概念)。
(2) 其次,没有末尾的分号(因为这不是 JavaScript 语句,所以不需要分号)。

(3) 数组

//JavaScript 中的数组字面量
var values = [25, "hi", true];
//在 JSON 中,可以采用同样的语法表示同一个数组:
[25, "hi", true]

2. 解析与序列化

(1) JSON对象

JSON 对象有两个方法:stringify()parse()。在最简单的情况下,这两个方法分别用于把 JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值。

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

// 默认情况下,JSON.stringify()输出的 JSON 字符串不包含任何空格字符或 缩进
{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3, "year":2011}
  1. 在序列化 JavaScript 对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。
  2. 此外,值为 undefined 的任何属性也都会被跳过。

(2) 序列化选项

JSON.stringify()除了要序列化的 JavaScript 对象外,还可以接收另外两个参数,这两 个参数用于指定以不同的方式序列化 JavaScript 对象。第一个参数是个过滤器,可以是一个数组,也可 以是一个函数;第二个参数是一个选项,表示是否在 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}
  1. 如果第二个参数是函数,传入的函数接收两个参数,属性(键)名和属性值。根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。
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;
            }
 });
*字符串缩进

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。

  1. 如果这个参数是一个`数值`,那它表示的是每个级别缩进的空格数。最大缩进空 格数为 10,所有大于 10 的值都会自动转换为 10。
var book = {
                    "title": "Professional JavaScript",
                    "authors": [
                        "Nicholas C. Zakas"
                    ],
                    edition: 3,
                    year: 2011
};
var jsonText = JSON.stringify(book, null, 4);

{
      "title": "Professional JavaScript",
      "authors": [
          "Nicholas C. Zakas"
      ],
      "edition": 3,
      "year": 2011
  }
  1. 如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON 字符串中被用作缩进字符(不再使 用空格)。
var jsonText = JSON.stringify(book, null, " - -");
{
    --"title": "Professional JavaScript",
    --"authors": [
    ----"Nicholas C. Zakas"
    --],
    --"edition": 3,
    --"year": 2011
 }
*toJSON()方法

给对象定义 toJSON()方法,返回其自身的 JSON 数据格式。

//这个对象也将被序列化为一个简单的字符串而非对象。
var book = {
                "title": "Professional JavaScript",
                 "authors": [
                     "Nicholas C. Zakas"
                ],
                edition: 3,
                year: 2011,
                 toJSON: function(){
                      return this.title;
                 }
           };
var jsonText = JSON.stringify(book);

序列化该对象的顺序:

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

(3) 解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。

var book = {
                "title": "Professional JavaScript",
                 "authors": [
                     "Nicholas C. Zakas"
                  ],
                edition: 3,
                year: 2011,
                releaseDate: new Date(2011, 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());

相关文章

网友评论

    本文标题:JavaScript 高级程序设计(第20章 JSON)

    本文链接:https://www.haomeiwen.com/subject/qlhliftx.html