JSON(JavaScript Object Notation)是表示值和对象的通用格式。

  

JavaScript 提供了如下方法:

  • JSON.stringify 将对象转换为 JSON。
  • JSON.parse 将 JSON 转换回对象。

stringify 方法提供了三个参数,分别是object,replacer,space

  1. object就是需要转换的对象
  2. replacer 表示是需要转换哪些属性的数组或者一个映射函数
  3. space 则表示输出的字符串的美观性,可以设置成空格数量

需要注意的是,object不能有循环引用,俗称“环形”结构;

代码如下:

let room = {
number: 2,
};
let meetup = {
title: "Conference",
participants: ["john", "joe"],
}; meetup.place = room;
room.occupiedBy = meetup; // stringify 属性的第二个参数replacer,接收属性数组或者映射函数;
console.log(JSON.stringify(meetup, ["title", "participants"])); //{"title":"Conference","participants":["john","joe"]} // 接下来这样呢?
meetup.participants = [{ name: "Alice" }, { name: "John" }]; console.log(JSON.stringify(meetup, ["title", "participants"])); //{"title":"Conference","participants":[{},{}]} // 这里可以看到,replacer执行的过滤很严格,所以我们需要在属性数组中追加属性 console.log(JSON.stringify(meetup, ["title", "participants", "name"])); //{"title":"Conference","participants":[{"name":"Alice"},{"name":"John"}]} // 虽然可行,但是属性列表太长了并不优雅;接下来: var result = JSON.stringify(meetup, function replacer(key, value) {
// 让我们把循环引用的键返回undefined
// console.log(key);
return key == "occupiedBy" ? undefined : value;
}); console.log(result);//{"title":"Conference","participants":[{"name":"Alice"},{"name":"John"}],"place":{"number":2}} // replacer会被递归的调用,直到所有可枚举的属性执行完毕 // 最后一步,第三个参数space表示空格的数量, 更美观 var beauty = JSON.stringify(meetup, function replacer(key, value) {
return key == "occupiedBy" ? undefined : value;
},2); console.log(beauty); //如你所见
`
{
    "title": "Conference",
    "participants": [
      {
        "name": "Alice"
      },
      {
        "name": "John"
      }
    ],
    "place": {
      "number": 2
    }
  }
`

parse方法则是解析JSON字符串为Object;parse方法提供了两个参数string,reviver 跟stringify的用法几乎一致;对每个可选的键值对进行调用;

代码如下:

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

let meetup = JSON.parse(str, function(key, value) {
if (key == 'date') return new Date(value);
return value;
}); alert( meetup.date.getDate() ); // 现在正常运行了!

当然,嵌套对象也是可以的,因为这一个过程是递归进行的,如何验证?只需要在reviver函数中打印一句话就显而易见了

toJSON方法允许我们自定义JSON转换;如果可用,JSON.stringify 会自动调用它

代码如下:

let room = {
number: 23,
toJSON() {
return this.number;
}
}; let meetup = {
title: "Conference",
room
}; alert( JSON.stringify(room) ); // 23 alert( JSON.stringify(meetup) );
/*
{
"title":"Conference",
"room": 23
}
*/

toJSON 方法即可用于自身,也可用于嵌套情况下;

推荐阅读:《现代JavaScript教程》- JSON方法,toJSON

2021-02-05

一分钟搞懂JavaScript中的JSON对象的更多相关文章

  1. 来一轮带注释的demo,彻底搞懂javascript中的replace函数

    javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...

  2. 简单使用JSON,JavaScript中创建 JSON 对象(一)

    JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...

  3. 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结

    1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象    ...

  4. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  5. 一文彻底搞懂JavaScript中的prototype

    prototype初步认识 在学习JavaScript中,遇到了prototype,经过一番了解,知道它是可以进行动态扩展的 function Func(){}; var func1 = new Fu ...

  6. 彻底搞懂javascript中的match, exec的区别

    在工作中经常发现一些同学把这两个方法搞混,以致把自己弄的很郁闷.所以我和大家一起来探讨一下这两个方法的奥妙之处吧. 我们分以下几点来讲解: 相同点: 1.两个方法都是查找符合条件的匹配项,并以数组形式 ...

  7. 一分钟搞懂 JavaScript this 指向问题

    关于Javascript的this指向问题,网络上有很多分析文章,写的很好,比如这里和这里 我这里做一个简单的总结. 箭头函数的 this 箭头函数内的this指向外层函数定义时所在的作用域.如果没有 ...

  8. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  9. 五分钟搞懂POM设计模式

    转载请注明出处️ 作者:IT小学生蔡坨坨 原文链接:五分钟搞懂POM设计模式 大家好,我是IT小学生蔡坨坨. 今天,我们来聊聊Web UI自动化测试中的POM设计模式. 为什么要用POM设计模式 前期 ...

随机推荐

  1. 如何在K8s,Docker-Compose注入镜像Tag

    最近在做基于容器的CI/CD, 一个朴素的自动部署的思路是: 从Git Repo打出git tag,作为镜像Tag ssh远程登录到部署机器 向部署环境注入镜像Tag,拉取镜像,重新部署 下面分享我是 ...

  2. ././include/linux/kconfig.h:4:32: fatal error: generated/autoconf.h: No such file or directory 解决办法

    我在编写内核驱动模块的时候报了一个非常奇怪的错误,如下图: 在目录下看了一下确实没有发现这个文件,感觉很奇怪,因为我记得之前编译模块是没有错误的,所以不可能是我代码写的有问题. 查阅了资料很多说要清除 ...

  3. Spring Security 实战干货:分布式对象SharedObject

    1. 前言 在上一篇我们对AuthenticationManager的初始化的细节进行了分析,其中里面有一段代码引起了不少同学的注意: ApplicationContext context = htt ...

  4. 计算机网络第7版 PDF+ 计算机网络释疑与习题解答第7版 PDF 计算机网络 课后答案

    网上全都是要钱的,要么就是第六版的,属实被恶心到了. 链接:https://pan.baidu.com/s/15jCOH6LXnQfB1RwGpNgBFg提取码:byMB

  5. 关于MongoDB的简单理解(二)--Java篇

    一.声明 本文依赖于 MongoDB JVM DRIVERS 4.1 版本编写. 本文案例依赖于 Maven 项目管理工具. 二.本文主要讲解哪些内容? 如何连接到MongoDB 通过TLS/SSL连 ...

  6. 洛谷P4127

    Description 给出两个数 \(a\),\(b\) ,求出 \([a,b]\) 中各位数字之和能整除原数的数的个数 Solution 设 \(f[i][j][k][q]\) 表示 枚举到第 i ...

  7. SpringMVC听课笔记(十一:国际化)

    1. 关于国际化 -- 在页面上根据浏览器的语言设置情况对文本(不是内容),时间,数值进行本地化处理 使用JSTL的fmt标签 -- 可以在bean中获取国际化资源文件 Locale对应的消息 在be ...

  8. docker版mysql的使用和配置(1)——docker的基本操作

    最近实在是忙成狗,其他的内容等稍微闲一点了一起更新. 这篇主要是讲docker版的mysql的使用和配置信息.因为实习公司需要搞一个docker做测试环境用,还需要包括基本的依赖.最重要的是,因为这个 ...

  9. msf+cobaltstrike联动(一):把msf的session发给cobaltstrike

    前提:MFS已经获取到session,可以进入metepreter,现在需要使用cobaltstrike进行图形化管理或团队协作. cobaltstrike起一个beacon监听,如使用:window ...

  10. 复制虚拟机,链接网络问题:没有找到合适的设备:没有找到可用于链接System eth0 的

    http://my.oschina.net/coolfire368/blog/292742 1./etc/udev/rules.d/70-persistent-net.rules 修改也成,修改时留下 ...