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. 1V升3V芯片,1V升3.3V芯片,大电流的,低功耗

    一般来说,1V的电压实在很低了,即使是干电池的话,再1V时,也是基本属于没电状态了.还有一种是干电池输出电流大时,也会把干电池的电压从1.5V拉低到1V左右. 更多的是客户对于1V时要能升到3V或者3 ...

  2. Ubuntu安装记录

    好吧,这成功地让我想起了那些边肯红薯边黑苹果的早晨······ 本人纯属Windows用腻,后期请大佬多多指教 前面因为没U盘而碰壁的内容在此不说,接下来因为太兴奋,关于安装U盘制作没记录什么.最终, ...

  3. STL_map和multimap容器

    一.map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...

  4. linux GPU上多个buffer间的同步 —— ww_mutex、dma-fence的使用 笔记

    原文链接:https://www.cnblogs.com/yaongtime/p/14111134.html   WW-Mutexes   在GPU中一次Render可能会涉及到对多个buffer的引 ...

  5. postgres多知识点综合案例

    使用到的知识点: 1.使用with临时存储sql语句,格式[with as xxx(), as xxx2() ]以减少代码: 2.使用round()取小数点后几位: 3.使用to_char()将时间格 ...

  6. 日志采集技术分析 Inode Inotify

    日志采集技术分析[阿里] - 新手学习导向 - 中国红客联盟 - Powered by HUC http://www.cnhonkerarmy.com/thread-236973-1-1.html

  7. (Sqlserver)sql求连续问题

    题目一:create table etltable( name varchar(20) , seq int, money int); create table etltarget ( name var ...

  8. https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/util/MurmurHash.html

    https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/util/MurmurHash.html https://github.com/ ...

  9. Page (computer memory) Memory segmentation Page table 虚拟地址到物理地址的转换

    A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described ...

  10. Python学习【第8篇】:python中的函数

    1.python中函数定义方法 def test(x): "This istest" y = x*2+1 return y vaule = test(2)print(vaule)运 ...