JSON 详解

json 相信大家一定耳熟能详,但是其实 json 在 JavaScript 中很多细节,本文就来详细讲解 json 在 JavaScript 中那些隐藏的秘密

JSON 的由来

  1. JSON 是一种数据格式,而不是编程语言,目前广泛用于客户端和服务器之间传输的数据格式
  2. JSON 全称 JavaScript Object Notation(JavaScript 对象符号)
    1. JSON 是由Douglas Crockford构想和设计的一种轻量级资料交换格式,算是 JavaScript 的一个子集
    2. 虽然 JSON 被提出来的时候是主要应用 JavaScript 中,但是目前已经独立于编程语言,可以在各个编程语言中被广泛的使用

JSON 的基本语法

  1. JSON 支持三种类型的值:
    1. 简单值:数字、字符串(不支持单引号)、布尔类型、null 类型
    2. 对象值:由key、value组成,key是字符串类型,并且必须添加双引号,值可以是简单值、对象值、数组值
    3. 数组值:数组的值可以是简单值、对象值、数组值
  2. tips:JSON 里面不能添加注释
  3. 具体的写法大家应该都知道,这里就不写示例代码了

JSON 的序列化

相信这个大家都知道,在 JavaScript 中的 JSON 对象上存在两个方法 stringify 和 parse,就可以实现序列化

序列化是将数据结构或对象转换为符合 JSON 格式的字符串的过程

简单使用

const obj = {
	name: '张三',
	age: 18,
	frienfs: [
		{ name: '李四', age: 20 },
		{ name: '王五', age: 22 }
	],
	hobbies: ['篮球', '足球', '乒乓球']
}

// 使用 stringify 方法转为 JSON 格式的字符串
const str = JSON.stringify(obj)

// 使用 parse 方法将一个 JSON 格式的字符串转为一个对象
const newObj = JSON.parse(str)

stringify 方法之 replacer

  1. stringify 方法的第一个参数大家都知道,那第二个参数(replacer)了解吗?

  2. replacer 是一个可选参数,replacer 的作用是指定需要想转换的值,是一个数组,或 null(全部转换) ,如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球']
    }
    
    // 正常转换
    const str1 = JSON.stringify(obj)
    console.log('str1: ', str1)
    
    // 排除 friends 和 hobbies
    const str2 = JSON.stringify(obj, ['name', 'age'])
    console.log('str2: ', str2)
    
  3. 结果如图:

    在这里插入图片描述

  4. 此时就可以发现,只转换了我们需要的部分,当我们存在这样的需求的时候,使用这个参数,是非常方便的

  5. tips:所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们

stringify 方法之 replacer 参数传入回调函数

  1. 上述例子中可以一定程度上实现一些额外的需求,但是针对高度自定义的需求还是有点无能为力,那么此时我们可以给其参数改为传入一个回调函数

  2. 传入一个回调函数时,会接收两个参数,key 和 value,而每一次进行序列转换的时候就会执行一次,如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球']
    }
    
    const str = JSON.stringify(obj, (key, value) => {
    	console.log(key, value)
    	return value
    })
    
    console.log(str)
    
  3. 执行结果如图:
    在这里插入图片描述

  4. 比如我们需要给 name 的值添加一个 @ 符号,并年龄 +1,如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球']
    }
    
    const str = JSON.stringify(obj, (key, value) => {
    	if (key === 'name') {
    		return value + '@'
    	}
    	if (key === 'age') {
    		return value + 1
    	}
    	return value
    })
    
    console.log(str)
    
  5. 结果如图:
    在这里插入图片描述

stringify 方法之 space

  1. 此方法除了第二个参数还存在第三个参数(space),此参数的作用为指定缩进用的空白字符串,用于美化输出

  2. 当 space 是一个数字时:它代表有多少的空格;上限为 10; 该值若小于 1,则意味着没有空格,如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球']
    }
    
    // 正常转换
    const str1 = JSON.stringify(obj)
    console.log('正常转换: ', str1)
    
    // 2个空格
    const str2 = JSON.stringify(obj, null, 2)
    console.log('2个空格: ', str2)
    
  3. 结果如图:

    在这里插入图片描述

  4. 此时输出的结果,就不是单纯的一行字符串,而是经过美化的格式,在一些调试查看数据的时候,还是非常好用的

  5. 当 space 是一个字符串时:则每一级别会比上一级别多缩进该字符串(或该字符串的前 10 个字符),如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球']
    }
    
    // 正常转换
    const str1 = JSON.stringify(obj)
    console.log('正常转换: ', str1)
    
    // 空格时
    const str2 = JSON.stringify(obj, null, ' ')
    console.log('空格时: ', str2)
    
    // 使用制表符(\t)来缩进
    const str3 = JSON.stringify(obj, null, '\t')
    console.log('制表符(\t): ', str3)
    
    // 字符长度超出 10
    const str4 = JSON.stringify(obj, null, 'aaabbbcccdddeee')
    console.log('字符长度超出 10: ', str4)
    
  6. 正常转换时,如图:

    在这里插入图片描述

  7. 空格时,如图:

    在这里插入图片描述

  8. 制表符时,如图:

    在这里插入图片描述

  9. 字符长度超出 10 时,如图:

    在这里插入图片描述

stringify 方法之 toJSON

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是该对象被序列化,而是调用 toJSON 方法后的返回值会被序列化

  1. 这个方法还是很好理解的,就是原来是转换原对象,但是如果有这个方法的话就会以我们这个方法的返回值为基准,如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球'],
    	toJSON: function () {
    		// 返回数字
    		return 111
    	}
    }
    
    console.log('toJSON: ', JSON.stringify(obj))
    
  2. 结果如图:

    在这里插入图片描述

  3. 同样,可以更换为其他对象,如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球'],
    	toJSON: function () {
    		// 返回数字
    		return {
    			name: '李白',
    			descripton: '一个浪漫的人'
    		}
    	}
    }
    
    console.log('toJSON: ', JSON.stringify(obj, null, 2))
    
  4. 结果如图:

    在这里插入图片描述

parse 方法之 reviver

  1. reviver 也是一个函数,执行时机在在 parse 函数返回之前,所以也可也来进行拦截或者说修改解析前的原始值

  2. 使用如下:

    const str = `{"name":"张三","age":18,"friends":[{"name":"李四","age":20},{"name":"王五","age":22}],"hobbies":["篮球","足球","乒乓球"]}`
    
    const obj = JSON.parse(str, (key, value) => {
    	if (key === 'age') {
    		return value + 2
    	}
    	return value
    })
    console.log(obj)
    
  3. 输出如图:

    在这里插入图片描述

  4. 在生成的对象之后,我们也可以发现,年龄是发生了变化的

利用 stringify 和 parse 实现深拷贝

  1. stringify 和 parse 搭配使用的时候,可以完成深拷贝,不敢存在一些限制,比如函数,循环引用,symbol 等等一些清空都是无法使用这种方式完成深拷贝的

  2. 只需要先使用 stringify 方法将对象转为 JSON 字符串,在使用 parse 方法进行解析即可,配合使用如下:

    const obj = {
    	name: '张三',
    	age: 18,
    	friends: [
    		{ name: '李四', age: 20 },
    		{ name: '王五', age: 22 }
    	],
    	hobbies: ['篮球', '足球', '乒乓球']
    }
    
    const obj2 = JSON.parse(JSON.stringify(obj))
    console.log('obj2: ', obj2)
    
    console.log('修改 obj2 的 name 属性的值为田七')
    
    obj2.name = '田七'
    
    console.log('obj: ', obj)
    console.log('obj2: ', obj2)
    
  3. 结果如图:

    在这里插入图片描述

  4. 可以看到,obj 并没有因为修改了 obj2 的值而受到影响,在一些简单的 JSON 形式的数据的对象时,使用此方法是一种非常不错的选择

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
task.json 是 Visual Studio Code 编辑器中的一个配置文件,用于定义任务(Task)的相关信息,包括任务的命令、参数、工作目录、输入输出、启动配置等。通过 task.json 文件,可以方便地配置、管理和运行各种任务。 task.json 中的常用参数包括: - label:任务的标签,用于在任务列表中显示。 - type:任务的类型,可以是 "shell"、"process" 或 "npm" 等。 - command:执行任务的命令。 - args:执行任务命令的参数。 - problemMatcher:用于匹配命令输出中的错误信息,并在编辑器中显示错误提示。 - options:任务的额外选项,例如设置任务执行时的工作目录、环境变量等。 - presentation:任务在编辑器中的显示设置,例如是否在终端中显示执行输出。 任务可以通过任务列表或者快捷键进行运行。任务列表显示了所有的任务,可以选择性地运行某个任务。此外,还可以通过快捷键将任务与编辑器的某个功能进行关联,从而实现快速执行任务。 在 task.json 文件中,常见的任务配置包括: - 编译项目:通过配置编译器的命令和参数,可以在任务列表中快速编译代码。 - 运行测试:配置测试框架的命令和参数,可以方便地运行测试用例进行调试。 - 启动服务:通过配置启动服务的命令和参数,可以在任务列表中一键启动服务。 - 打包应用:配置打包工具的命令和参数,可以自动化生成可部署的应用程序。 总之,task.json 是 Visual Studio Code 编辑器中用于配置和管理任务的关键配置文件,通过它可以提高开发效率,简化操作,实现自动化和快速执行各种任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值