目录
3.2 使用 reviver 参数,将 JSON 对象解析出来的 string 转化为 Date
4.2.1 replacer 是函数 —— 序列化 部分 传入的对象
4.2.2 replacer 是函数 —— 序列化 部分 传入的数组
4.2.3 replacer 是数组 —— 序列化数组中指定的键值
4.4.1 转换的值如果存在 toJSON(),则仅执行 toJSON()
4.4.2 JSON.stringify() 会把 Date() 序列化为 时间戳 字符串
JSON —— JavaScript Object Notation 【JavaScript 对象表示法】
JSON 使用 Javascript 语法来描述数据对象,但 JSON 被多种编程语言支持,它独立于语言
JSON 文件的文件类型是 .json
JSON 文本的 MIME 类型是 application/json
JSON 的值可以是:
举个栗子~
- // JSON 数字
- { "age": 30 }
-
- // JSON 对象
- { key1 : value1, ... keyN : valueN }
-
- // JSON 数组
- {
- "pollutions": [
- { "name":"miaomiao" , "url":"www.miaomiao.com" },
- { "name":"google" , "url":"www.google.com" },
- ]
- }
-
- // JSON 布尔值
- { "flag": true }
-
- // JSON null
- { "runoob": null }
JSON 和 XML 都用于 —— 接收 web 服务端的数据
- // JSON
- {
- "pollutions": [
- { "name":"miaomiao" , "url":"www.miaomiao.com" },
- ]
- }
-
- // XML
- <site>
- <name>miaomiaoname> <url>www.miaomiao.comurl>
- site>
最重要的不同:XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析
使用 XML 的步骤:
使用 JSON 的步骤:
所以,使用 JSON 更方便
服务器返回的数据,一般是字符串,可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象
JSON.parse(text[, reviver])
text:必需, 一个有效的 JSON 字符串
reviver:可选,一个转换结果的函数, 将为对象的每个成员调用此函数
JSON 不能存储 Date() 对象,可以利用 JSON.parse() 的第二个参数,对转换的数据进行处理
举个栗子~
- var text = '{ "name":"miaomiao", "initDate":"2013-12-14", "site":"www.miaomiao.com"}';
-
- var obj = JSON.parse(text, function (key, value) {
- if (key == "initDate") {
- return new Date(value);
- } else {
- return value;
- }
- });
-
- console.log(obj)

向服务器发送的数据,一般是字符串,可以使用 JSON.stringify() 方法将值转换为字符串
JSON.stringify(value[, replacer[, space]])
value:必需。 要转换的 JavaScript 值(通常为对象或数组)
replacer:可选。用于转换结果的函数或数组
space:可选。文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t
若 replacer 函数返回 undefined 或者函数,则值会被忽略
- /**
- * 序列化回调方法
- * @param {*} key 键名
- * @param {*} value 键值
- * @returns
- */
- function replacer(key, value) {
- // 如果键值为字符串格式,则不进行序列化(输出结果不带当前键值对)
- if (typeof value === "string") {
- return undefined;
- }
- return value;
- }
- const userInfo = {
- name: 'miaomiao',
- age: 23,
- sex: '女'
- }
- console.log(JSON.stringify(userInfo, replacer));

若 replacer 函数返回 undefined ,当前值不会被忽略,而将会被 null 取代
- /**
- * 序列化回调方法
- * @param {*} key 键名
- * @param {*} value 键值
- * @returns
- */
- function replacer(key, value) {
- // 如果值为字符串格式,则序列化返回 null
- if (typeof value === "string") {
- return undefined;
- }
- return value;
- }
-
- const foodList = ['苹果', 666, '香蕉', 888]
-
- console.log(JSON.stringify(foodList, replacer));

转换数组中 具有键值 的成员
- const userInfo = {
- name: 'miaomiao',
- age: 23,
- sex: '女'
- }
-
- console.log(JSON.stringify(userInfo, ['name', 'age']));

为了便于阅读 JSON 数据,将每一级数据赋予不同的缩进
- const userInfo = {
- name: 'miaomiao',
- age: 23,
- hobby: [{
- label: '第五人格',
- value: 'dwrg',
- }, {
- label: '双人成行',
- value: 'srcx',
- }]
- }
- console.log(JSON.stringify(userInfo, null, 6));

- const userInfo = {
- name: 'miaomiao',
- age: 23,
- toJSON() {
- console.log('禁止转换我')
- }
- }
- console.log(JSON.stringify(userInfo));
console.log(JSON.stringify(new Date()));

- const userInfo = {}
-
- Object.defineProperty(userInfo, "home", {
- adrress: '北京',
- enumerable: false
- });
-
- Object.defineProperty(userInfo, "date", {
- value: '2022-11-26',
- enumerable: true
- });
-
- console.log(JSON.stringify(userInfo));

- const userInfo = {
- name: 'miaomiao',
- [Symbol('testSymbol')]: 'testSymbol'
- }
- console.log(JSON.stringify(userInfo));

所有支持 JavaScript 的浏览器,都会使用“同源策略”
JSONP(JSON with Padding) 是 JSON 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即 —— 跨域读取数据
实现原理:利用了 script 标签的 src 没有跨域限制