位置: IT常识 - 正文

37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项

编辑:rootadmin
37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项

推荐整理分享37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

文章目录JSON处理JSON.stringifystringify的限制排除和替换映射函数格式化使用的空格数量自定义toJSON方法JSON.parse使用reviver总结JSON处理

JSON(JavaScript Object Notation)是JavaScript表达值和对象的通用数据格式,其本质就是符合一定规范的字符串。由于JSON的优良特性,非常容易和其他语言进行数据交换,尤其在前后端交互方面。即使我们前端使用JavaScript,后端使用Java/PHP/Python同样可以使用JSON格式的数据轻松交换。

JSON.stringify

JavaScript为我们提供了简单的方法可以实现对象和字符串之间的转化。

JSON.stringify将对象转为JSON字符串;JSON.parse将JSON字符串转为对象;

例如,我们把一个对象Dog使用 JSON.string转为JSON字符串:

let Dog = { name:'Peter', age:187, gender:'male', hands:['hand01','hand02','hand03','hand04'], childs:[ { name:'little peter01', age:2, gender:'male', hands:['hand01','hand02','hand03','hand04'], childs:[] }, { name:'little peter02', age:3, gender:'male', hands:['hand01','hand02','hand03','hand04'], childs:[] } ]}let dogJson = JSON.stringify(Dog)console.log(typeof dogJson)console.log(dogJson)

代码的执行效果:

可见,使用JSON.stringify(obj)方法会返回该对象obj的JSON字符串数据,这个转换的过程可以称作JSON编码(JSON-encoded)、序列化(serialized),亦或者编组化(marshalled)。当对象转为普通的字符串后,我们就可以以普通数据的格式存储、传递这些数据。

如果我们把这些字符串写入数据库,就相当于把JavaScript对象存进了数据库。

注意:

JSON编码的对象统一使用双引号,没有单引号和反引号;对象的属性名也用双引号,这是强制的;

JSON已经发展成为了独立的数据规范,因此归属于JavaScript语言本身的非数据属性会被JSON.stringify跳过。

包括:

对象方法;Symbol类型undefined的属性let user = { sayHello(){//函数被忽略 console.log('hello world'); }, [Symbol('id')]:996996,//Symbol被忽略 val:undefined//undefined值被忽略}console.log(JSON.stringify(user))

代码执行效果:

可以看到,里面啥也没有。

stringify的限制

并非所有的对象都能转为JSON格式,如果对象之间存在循环引用,就会导致转换失败。

let father = {}let son = {}father.son = sonson.father = fatherJSON.stringify(father)

代码执行结果:

这里出现错误的原因就是存在对象间的循环引用,Father引用了Son,而Son又反过来引用了Father。

排除和替换

如果我们只希望将对象的个别属性转为JSON格式,或者摆出循环应用中的属性,应该怎么做呢?

JSON.stringify已经为我们提供了解决方法:

let json = JSON.stringify(obj[,replacer,space])

参数解读:

obj:要编码的对象replacer:要编码的属性数组或者映射函数function(k,v)space:用于格式化的空格数量

举个例子:

let father = { name:'father', age:28}let son = { name:'son', age:4}father.son = son;son.father = father;console.log(JSON.stringify(father,['name','age']))

代码的执行结果如下:

如果我们在第二个参数传入一个数组,那么JSON.stringify就会只把数组中的名称转为JSON格式,这样计算对象存在循环引用,同样能够成功的转格式。

如果我们希望序列化出循环应用外的所有对象属性,只需要把对象的所有属性名写入数组即可,这对对象的子对象同样生效。

举个例子:

let father = { name:'father', age:28, car:{ car_name : "BYD", car_age:3, }}console.log(JSON.stringify(father,['name','car','car_name']))

代码执行结果:

但是,还存在一个问题,如果对象属性特别多,可能数组就会非常长,代码也会很冗长。

这种情况下就需要使用映射函数

映射函数

我们可以创建一个函数,代替数组作为replacer,这个函数接收(key,value)作为参数,并决定如何序列化对应的属性。

例如,在解决循环引用的时候,我们排除引用属性:

let father = { name:'father', age:28, car:{ car_name : "BYD", car_age:3,}}let son = { name:'son', age:4}father.son = son;son.father = father;console.log(JSON.stringify(father,function replacer(key,value){ console.log(`${key}:${value}`)return (key=='son')?undefined:value;}))37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项

代码执行结果如下:

由于值为undefined的属性会被JSON.stringify忽略,这样我们就可以轻松的排除所有不希望出现的属性了。

格式化使用的空格数量

JSON.stringify(value, replacer, spaces)的第三个参数spaces可以指定JSON字符串的缩进空格数,常用的数值有2、4两种,相信童鞋们已经在编辑代码的时候有过修改缩进tab空格数的经历了。

在上文案例中,我们没有指定缩进空格数量,所以格式化后的JSON字符串都是没有格式的。

举个例子:

let Dog = { name:'Peter', age:187, gender:'male', hands:['hand01','hand02','hand03','hand04'], childs:[ { name:'little peter01', age:2, gender:'male', hands:['hand01','hand02','hand03','hand04'], childs:[] }, { name:'little peter02', age:3, gender:'male', hands:['hand01','hand02','hand03','hand04'], childs:[] } ]}let dogJson = JSON.stringify(Dog,null,2)console.log(dogJson)

代码的执行结果:

对比本文的第一个案例,是不是这样的缩进看起来好看多了呢?

自定义toJSON方法

在之前的文章中,我们讲到每个对象都有的toString方法,当进行格式转换时会自动调用。和toString一样,对象的toJSON方法会在序列化的时候调用,我们可以通过重写这个方法改变序列化的方式。

例如:

let dog = { name : 'peter', age:18}console.log(JSON.stringify(dog))dog.toJSON = function(){ return this.age;}console.log(JSON.stringify(dog))

代码执行结果:

我们可以看到,在重写了对象的toJSON方法后,使用stringify的结果发生了改变。

我们可以根据自己的需要重写toJSON方法,从而达到自己的目的。

JSON.parse

上文讲到了如何使用JSON.stringify把对象转为JSON格式的字符串,这里就详细介绍如何把JSON字符串转为对象。

语法:

let obj = JSON.parse(str,[reviver])

str 要解析的 JSON 字符串。

reviver 可选的函数 function(key,value),该函数将为每个 (key, value) 对调用,并可以对值进行转换。

例如:

let str_arr = '[1,2,3]'//数组字符串let arr = JSON.parse(str_arr)console.log(typeof arr)

代码执行结果:

对于复杂的嵌套对象:

let str_obj = `{ "name": "Peter", "age": 187, "gender": "male", "hands": [ "hand01", "hand02", "hand03", "hand04" ], "childs": [ { "name": "little peter01", "age": 2, "gender": "male", "hands": [ "hand01", "hand02", "hand03", "hand04" ], "childs": [] }, { "name": "little peter02", "age": 3, "gender": "male", "hands": [ "hand01", "hand02", "hand03", "hand04" ], "childs": [] } ]}`let obj = JSON.parse(str_obj)console.log(obj.name)

代码执行结果:

注意:JSON不支持注释,在JSON中添加注释时错误的行为

有一种名为JSON5的格式,可以有不加引号的键、允许注释,但是这是独立的库,补上官方标准。

常规的JSON格式严格,这样是为了保证数据的可靠、快速解析算法

使用reviver

既然JSON.parse能够直接转字符串为对象,为啥还要再搞reviver呢?

场景举例:

如果我们有一个对象字符串如下:

// title: (meetup title), date: (meetup date)let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';

现在我们要将它转为对象,存在什么问题呢?

let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';let obj = JSON.parse(str)obj.date.getDate();//Error

代码执行结果如下:

造成这种结果的原因是date属性被转为了字符串,而不是Date对象。

这个时候就需要我们使用reviver函数将date转为Date对象:

let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';let obj = JSON.parse(str,function(key,value){ if(key=='date')return new Date(value) return value})obj.date.getDate();

代码执行效果:

顺便说一下,这也适用于嵌套对象:

let schedule = `{ "meetups": [ {"title":"Conference","date":"2017-11-30T12:00:00.000Z"}, {"title":"Birthday","date":"2017-04-18T12:00:00.000Z"} ]}`;schedule = JSON.parse(schedule, function(key, value) { if (key == 'date') return new Date(value); return value;});alert( schedule.meetups[1].date.getDate() ); // 正常运行了!总结JSON是一种数据格式,有独立的标准和大多数编程语言的支持JSON支持Object、array、string、number、boolean和nullJSON.stringifyJSON.parse
本文链接地址:https://www.jiuchutong.com/zhishi/300415.html 转载请保留说明!

上一篇:AI遮天传 NLP-词表示(遮天传官网)

下一篇:JS实现轮播图(一看就懂逻辑清晰)(js轮播图视频教程)

  • QQ浏览器V10.8.0版本(qq浏览器10.0.0)

    QQ浏览器V10.8.0版本(qq浏览器10.0.0)

  • 闲鱼有些人故意不点收货(闲鱼有些人故意放菜鸟怎么办)

    闲鱼有些人故意不点收货(闲鱼有些人故意放菜鸟怎么办)

  • 台式机自己可以换显卡吗(台式机自己可以更换什么)

    台式机自己可以换显卡吗(台式机自己可以更换什么)

  • 电池温度40度正常吗(电池温度40度正常嘛)

    电池温度40度正常吗(电池温度40度正常嘛)

  • 华为高清通话会额外产生费用吗(华为高清通话怎么收费)

    华为高清通话会额外产生费用吗(华为高清通话怎么收费)

  • 一个华为账号可以登录几个手机(一个华为账号可以绑定几个手机)

    一个华为账号可以登录几个手机(一个华为账号可以绑定几个手机)

  • 华为微信通话怎么隐藏悬浮(华为微信通话怎么录音功能)

    华为微信通话怎么隐藏悬浮(华为微信通话怎么录音功能)

  • 微信公众号是自媒体吗(微信公众号是自己的微信号吗)

    微信公众号是自媒体吗(微信公众号是自己的微信号吗)

  • mate30屏幕刷新率(mate30屏幕刷新率可以调吗)

    mate30屏幕刷新率(mate30屏幕刷新率可以调吗)

  • 拼多多评价在哪里看自己评价的内容(拼多多评价在哪里看忘截图了)

    拼多多评价在哪里看自己评价的内容(拼多多评价在哪里看忘截图了)

  • 微信团队有什么用(微信团队有什么回答)

    微信团队有什么用(微信团队有什么回答)

  • 网络协议分析的作用(网络协议分析的意义)

    网络协议分析的作用(网络协议分析的意义)

  • 小米照片打印机连接不上(小米照片打印机怎么样)

    小米照片打印机连接不上(小米照片打印机怎么样)

  • 微信申诉次数上限(微信申诉次数上限多少次)

    微信申诉次数上限(微信申诉次数上限多少次)

  • 申请访问空间对方会收到什么信息(申请访问空间对方会收到什么信息图片)

    申请访问空间对方会收到什么信息(申请访问空间对方会收到什么信息图片)

  • word页面怎么排序(word页面排版)

    word页面怎么排序(word页面排版)

  • 手机上怎么买动车票(手机上怎么买动车学生票)

    手机上怎么买动车票(手机上怎么买动车学生票)

  • 本地连接禁用了怎么恢复(本地连接禁用了,怎么也启动不了,怎么办?)

    本地连接禁用了怎么恢复(本地连接禁用了,怎么也启动不了,怎么办?)

  • 微信怎么查看出行历史(微信怎么查看出行轨迹)

    微信怎么查看出行历史(微信怎么查看出行轨迹)

  • imessge已送达是不是对方就收到了

    imessge已送达是不是对方就收到了

  • WPS重用幻灯片在哪(wps2019重用幻灯片在哪)

    WPS重用幻灯片在哪(wps2019重用幻灯片在哪)

  • 咸鱼怎么删除卖家评价(咸鱼怎么删除卖出的动态)

    咸鱼怎么删除卖家评价(咸鱼怎么删除卖出的动态)

  • 玻璃手机壳防摔吗(玻璃手机壳防摔还是软壳防摔)

    玻璃手机壳防摔吗(玻璃手机壳防摔还是软壳防摔)

  • 微信好友朋友圈显示一跳杠(微信好友朋友圈屏蔽你是什么样子)

    微信好友朋友圈显示一跳杠(微信好友朋友圈屏蔽你是什么样子)

  • 在Win7中,防火墙怎么设置无法更改?(w7防火怎么开)

    在Win7中,防火墙怎么设置无法更改?(w7防火怎么开)

  • 财政的税收
  • 劳务报酬所得税可以退税吗
  • 财务报表与分析课后答案
  • 公司控股另一家公司的风险
  • 个人去税务局开专票需要提供什么
  • 报销单用法
  • 已申报未导入是申报成功了吗
  • 营改增后房地产企业增值税税收筹划存在问题
  • 临时员工和正式员工区别
  • 非财政拨款结余是什么科目
  • 运保佣是什么
  • 蓝字发票未入账收到红字发票处理?
  • 个人在电商平台购买跨境商品需要缴纳什么税
  • 小规模纳税人咨询费税率
  • 增值税返还收入冲减进项税
  • 递延所得税资产怎么计算
  • 在建工程印花税计税依据
  • 外汇收入会计分录
  • 少数股东损益为正,归属毌公司为负
  • 固定资产管理的论文
  • 工地买东西怎么记账
  • 如何修复win7系统引导
  • 公司买手机怎么做账务处理
  • windows 11硬件
  • 什么是主营业务税金及附加
  • 别人从我公司走账怎么做账务处理
  • 下岗职工生活费最多发多少个月
  • PHP:JulianToJD()的用法_日历函数
  • php pathinfo
  • 微笑的树懒哥斯达黎加
  • web网页制作软件
  • Yii2使用swiftmailer发送邮件的方法
  • 合伙企业利润分配原则
  • transform模块
  • 什么是异步函数
  • 身份证号码的正确读法
  • packet命令
  • python怎么做gui
  • 申请税控盘流程需要几个工作日
  • 公司房租收据怎么写
  • sql server配置文件在哪
  • MongoDB的mongo shell常用操作方法及操作脚本笔记
  • 帝国cms使用手册
  • 利息支出是利息费用减利息收入吗
  • 增值税减免税在贷方
  • 重复报销怎么写情况说明
  • 固定资产后续支出
  • 一般纳税人的增值税税率
  • 高速公路过路费怎么算的
  • 固定资产账实不符违反的规定
  • 公账上的钱怎么提出来
  • 办理外经证后缴税怎么交
  • 损益类科目没有结平是什么意思
  • 小规模附加税要交吗
  • 赔偿金是营业外收入吗
  • 物流行业会计的工作内容
  • sqlserver 获取表字段
  • centos ssh permission denied
  • centos6.7安装图形界面教程
  • Mac系统中使用QuickTime Player实现屏幕录像图文教程
  • diy组装电脑前置怎么样
  • xp系统自动升级win7
  • WIN7系统共享文件夹 您没有权限访问
  • 电脑window8系统怎么样
  • vlcplayer最新版
  • vsftpd怎么配置
  • windows8装windows10,文件会丢失吗
  • linux shell 字符串转数字
  • 什么是Shell,shell作用
  • [置顶] 启动unity3d 提示“unity3d EditorWindow could not be loaded because the script is not found in the projec”
  • 结合mint-ui移动端下拉加载实践方法总结
  • linux shell执行命令
  • centos安装完成后桌面没有图标
  • 安卓开发viewpager的用法
  • jquery 输入框输入完触发事件
  • android底部弹出页面
  • 发票红冲步骤图片
  • 海南省税务局网站
  • 游艇车船税怎么收
  • 公司财务专用章的用途
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设