dedecms 网站名称,高端建站费用,预付网站建设服务费如何入账,网站子站建设第 23 章 JSON
23.1 语法
JSON 语法支持表示 3 种类型的值。
❑ 简单值#xff1a;字符串、数值、布尔值和 null 可以在 JSON 中出现#xff0c;就像在 JavaScript 中一样。特殊值 undefined 不可以。 ❑ 对象#xff1a;第一种复杂数据类型#xff0c;对象表示有序键/值…第 23 章 JSON
23.1 语法
JSON 语法支持表示 3 种类型的值。
❑ 简单值字符串、数值、布尔值和 null 可以在 JSON 中出现就像在 JavaScript 中一样。特殊值 undefined 不可以。 ❑ 对象第一种复杂数据类型对象表示有序键/值对。每个值可以是简单值也可以是复杂类型。 ❑ 数组第二种复杂数据类型数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型包括简单值、对象甚至其他数组。
23.1.1 简单值
最简单的 JSON 可以是一个数值也可以是一个字符串JavaScript 字符串与 JSON 字符串的主要区别是JSON 字符串必须使用双引号单引号会导致语法错误。布尔值和 null 本身也是有效的 JSON 值。
23.1.2 对象
JSON 中的对象必须使用双引号把属性名包围起来。
与 JavaScript 对象字面量相比JSON 主要有两处不同。首先没有变量声明JSON 中没有变量。其次最后没有分号不需要因为不是 JavaScript 语句。同样用引号将属性名包围起来才是有效的 JSON。属性的值可以是简单值或复杂数据类型值后者可以在对象中再嵌入对象。
23.1.3 数组
23.2 解析与序列化
23.2.1 JSON 对象
JSON 对象有两个方法stringify()和 parse()。在简单的情况下这两个方法分别可以将 JavaScript 序列化为 JSON 字符串以及将 JSON 解析为原生 JavaScript 值。
在序列化 JavaScript 对象时所有函数和原型成员都会有意地在结果中省略。此外值为 undefined 的任何属性也会被跳过。最终得到的就是所有实例属性均为有效 JSON 数据类型的表示。
23.2.2 序列化选项
JSON.stringify()方法除了要序列化的对象还可以接收两个参数。这两个参数可以用于指定其他序列化 JavaScript 对象的方式。第一个参数是过滤器可以是数组或函数第二个参数是用于缩进结果 JSON 字符串的选项。
1过滤结果
如果第二个参数是一个数组那么 JSON.stringify()返回的结果只会包含该数组中列出的对象属性。
let book {title: Professional JavaScript,authors: [Nicholas C. Zakas, Matt Frisbie],edition: 4,year: 2017
}
let jsonText JSON.stringify(book, [title, edition]) // {title:Professional JavaScript,edition:4}如果第二个参数是一个函数则行为又有不同。提供的函数接收两个参数属性名key和属性值value。
let book {title: Professional JavaScript,authors: [Nicholas C. Zakas, Matt Frisbie],edition: 4,year: 2017
}
let jsonText JSON.stringify(book, (key, value) {switch (key) {case authors:return value.join(,)case year:return 5000case edition:return undefineddefault:return value}
})
// {title:Professional JavaScript,authors:Nicholas C. Zakas,Matt Frisbie,year:5000}2字符串缩进
JSON.stringify()方法的第三个参数控制缩进和空格。在这个参数是数值时表示每一级缩进的空格数。
let book {title: Professional JavaScript,authors: [Nicholas C. Zakas, Matt Frisbie],edition: 4,year: 2017
}
let jsonText JSON.stringify(book, null, 4)
// {\n
// title: Professional JavaScript,\n
// authors: [\n
// Nicholas C. Zakas,\n
// Matt Frisbie\n
// ],\n
// edition: 4,\n
// year: 2017\n
// }注意除了缩进JSON.stringify()方法还为方便阅读插入了换行符。这个行为对于所有有效的缩进参数都会发生。只缩进不换行也没什么用。最大缩进值为 10大于 10 的值会自动设置为 10。
如果缩进参数是一个字符串而非数值那么 JSON 字符串中就会使用这个字符串而不是空格来缩进。使用字符串时同样有 10 个字符的长度限制。如果字符串长度超过 10则会在第 10 个字符处截断。
3toJSON()方法
let book {title: Professional JavaScript,authors: [Nicholas C. Zakas, Matt Frisbie],edition: 4,year: 2017,toJSON: function () {return this.title}
}
let jsonText JSON.stringify(book) // Professional JavaScripttoJSON()方法可以与过滤函数一起使用因此理解不同序列化流程的顺序非常重要。在把对象传给 JSON.stringify()时会执行如下步骤。
1如果可以获取实际的值则调用 toJSON()方法获取实际的值否则使用默认的序列化。 2如果提供了第二个参数则应用过滤。传入过滤函数的值就是第1步返回的值。 3第2步返回的每个值都会相应地进行序列化。 4如果提供了第三个参数则相应地进行缩进。
23.2.3 解析选项
JSON.parse()方法也可以接收一个额外的参数这个函数会针对每个键/值对都调用一次。为区别于传给 JSON.stringify()的起过滤作用的替代函数replacer这个函数被称为还原函数reviver。实际上它们的格式完全一样即还原函数也接收两个参数属性名key和属性值value另外也需要返回值。
如果还原函数返回 undefined则结果中就会删除相应的键。如果返回了其他任何值则该值就会成为相应键的值插入到结果中。
let book {title: Professional JavaScript,authors: [Nicholas C. Zakas, Matt Frisbie],edition: 4,year: 2017,releaseDate: new Date(2017, 11, 1)
}
let jsonText JSON.stringify(book)
let bookCopy JSON.parse(jsonText, (key, value) (key releaseDate ? new Date(value) : value))
console.log(bookCopy.releaseDate.getFullYear()) // 2017