JavaScript--19 JSON 语法

烈酒焚心 提交于 2019-12-19 05:44:08

JSON 的语法可以表示以下三种类型的值。
简单值:使用与JavaScript 相同的语法,可以在JSON 中表示字符串、数值、布尔值和null。但JSON 不支持JavaScript 中的特殊值undefined。
对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。
JSON 不支持变量、函数或对象实例,它就是一种表示结构化数据的格式。

支持属性

简单值

数字、布尔值和null 都是有效的JSON 形式。
需要注意的是字符串,下面是JSON 表示字符串的方式:

"Hello world!"

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

对象

JSON 中的对象与JavaScript 字面量稍微有一些不同。
JavaScript 的对象字面量:

var person = {
  name: "Nicholas",
  age: 29
};

// 前面的对象字面量完全也可以写成下面这样:
var object = {
  "name": "Nicholas",
  "age": 29
};

JSON 表示上述对象的方式如下:

{
  "name": "Nicholas",
  "age": 29
}

与JavaScript 的对象字面量相比,JSON 对象有两个地方不一样。
首先,没有声明变量(JSON 中没有变量的概念)。
其次,没有末尾的分号(因为这不是JavaScript 语句,所以不需要分号)。
要注意的是,对象的属性必须加双引号,这在JSON 中是必需的。
属性的值可以是简单值,也可以是复杂类型值,因此可以像下面这样在对象中嵌入对象:

{
  "name": "Nicholas",
  "age": 29,
  "school": {
    "name": "Merrimack College",
    "location": "North Andover, MA"
  }
}

与JavaScript 不同,JSON 中对象的属性名任何时候都必须加双引号。手工编写JSON 时,忘了给对象属性名加双引号或者把双引号写成单引号都是常见的错误。

数组

下面是JavaScript 中的数组字面量:

var values = [25, "hi", true];

在JSON 中,可以采用同样的语法表示同一个数组:

[25, "hi", true]

同样要注意,JSON 数组也没有变量和分号。把数组和对象结合起来,可以构成更复杂的数据集合,
例如:

[
  {
    "title": "Professional JavaScript",
    "authors": [
      "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
  },
  {
    "title": "Professional JavaScript",
    "authors": [
      "Nicholas C. Zakas"
    ],
    edition: 2,
    year: 2009
  },
  {
    "title": "Professional Ajax",
    "authors": [
      "Nicholas C. Zakas",
      "Jeremy McPeak",
      "Joe Fawcett"
    ],
    edition: 2,
    year: 2008
  },
  {
    "title": "Professional Ajax",
    "authors": [
      "Nicholas C. Zakas",
      "Jeremy McPeak",
      "Joe Fawcett"
    ],
    edition: 1,
    year: 2007
  },
  {
    "title": "Professional JavaScript",
    "authors": [
      "Nicholas C. Zakas"
    ],
    edition: 1,
    year: 2006
  }
]

这个数组中包含一些表示图书的对象。每个对象都有几个属性,其中一个属性是"authors",这个属性的值又是一个数组。对象和数组通常是JSON 数据结构的最外层形式(当然,这不是强制规定的)。

解析对象

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()把一个JavaScript 对象序列化为一个JSON 字符串,然后将它保存在变量jsonText 中。默认情况下,JSON.stringify()输出的JSON 字符串不包含任何空格字符或缩进。
在序列化JavaScript 对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined 的任何属性也都会被跳过。结果中最终都是值为有效JSON 数据类型的实例属性。

JSON.stringify() 方法

实际上,JSON.stringify()除了要序列化的JavaScript 对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化JavaScript 对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON 字符串中保留缩进。
数值过滤

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}

函数过滤

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}

如果键为"authors",就将数组连接为一个字符串;如果键为"year",则将其值设置为5000;如果键为"edition",通过返回undefined 删除该属性。最后,一定要提供default 项,此时返回传入的值,以便其他值都能正常出现在结果中。

输出空格缩进

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。例如,要在每个级别缩进4 个空格,可以这样写代码:

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
}
*/

输出字符串缩进
JSON.stringify()也在结果字符串中插入了换行符以提高可读性。最大缩进空格数为10,所有大于10 的值都会自动转换为10。
如果缩进参数是一个字符串而非数值,则这个字符串将在JSON 字符串中被用作缩进字符(不再使用空格)。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符。

var jsonText = JSON.stringify(book, null, " - -");

这样,jsonText 中的字符串将变成如下所示:

{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas"
--],
--"edition": 3,
--"year": 2011
}

缩进字符串最长不能超过10 个字符长。如果字符串长度超过了10 个,结果中将只出现前10 个字符。

JSON.parse() 方法

JSON.parse() 方法将 JSON 字符串转换为 JSON 对象。

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);

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;
  }
});
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!