JavaScript中JSON的5个小技巧
关于 JavaScript的JSON的一些小技巧 1. 格式化
默认的字符串化器还会缩小 JSON,看起来很难看 const user = { name: "John", age: 30, isAdmin: true, friends: ["Bob", "Jane"], address: { city: "New York", country: "USA" } }; console.log(JSON.stringify(user)); //=> {"name":"John","age":30,"isAdmin":true,"friends":["Bob","Jane"],"address":{"city":"New York","country":"USA"}}
JSON.stringify 也有一个内置的格式化程序! console.log(JSON.stringify(user, null, 2)); // { // "name": "John", // "age": 30, // "isAdmin": true, // "friends": [ // "Bob", // "Jane" // ], // "address": { // "city": "New York", // "country": "USA" // } // }
(如果你想知道那个 null 是什么,我们稍后会谈到)
在此示例中,JSON 格式为 2 个缩进空格。
我们还可以指定用于缩进的自定义字符。 console.log(JSON.stringify(user, null, "lol")); // { // lol"name": "John", // lol"age": 30, // lol"isAdmin": true, // lol"friends": [ // lollol"Bob", // lollol"Jane" // lol], // lol"address": { // lollol"city": "New York", // lollol"country": "USA" // lol} // } 2. 隐藏字符串化数据中的某些属性
JSON.stringify 第二个参数,这在很大程度上是未知的。它被称为replacer,它是一个函数或数组,用于决定哪些数据保留在输出中,哪些不保留。
这是一个简单的示例,我们可以在其中隐藏password用户。 const user = { name: "John", password: "12345", age: 30 }; console.log(JSON.stringify(user, (key, value) => { if (key === "password") { return; } return value; }));
这是输出:
{"name":"John","age":30}
我们可以进一步重构: function stripKeys(...keys) { return (key, value) => { if (keys.includes(key)) { return; } return value; }; } const user = { name: "John", password: "12345", age: 30, gender: "male" }; console.log(JSON.stringify(user, stripKeys("password", "gender")))
输出:
{"name":"John","age":30}
还可以传递一个数组来仅获取某些键: const user = { name: "John", password: "12345", age: 30 } console.log(JSON.stringify(user, ["name", "age"]))
输出相同的东西。
这也适用于数组。如果你有一大堆蛋糕: const cakes = [ { name: "Chocolate Cake", recipe: [ "Mix flour, sugar, cocoa powder, baking powder, eggs, vanilla, and butter", "Mix in milk", "Bake at 350 degrees for 1 hour", // ... ], ingredients: ["flour", "sugar", "cocoa powder", "baking powder", "eggs", "vanilla","butter"]}, // tons of these ];
我们可以轻松地做同样的事情,并且替换器将应用于每个蛋糕: const cakes = [ { name: "Chocolate Cake", recipe: [ "Mix flour, sugar, cocoa powder, baking powder, eggs, vanilla, and butter", "Mix in milk", "Bake at 350 degrees for 1 hour", // ... ], ingredients: ["flour", "sugar", "cocoa powder", "baking powder", "eggs", "vanilla","butter"]}, // tons of these ]; console.log(JSON.stringify(cakes, ["name"]))
我们得到这个:
[{"name":"Chocolate Cake"},{"name":"Vanilla Cake"},...] 3.使用toJSON创建自定义输出格式
如果一个对象实现了该toJSON函数,JSON.stringify将使用它来对数据进行字符串化。
考虑一下: class Fraction { constructor(n, d) { this.numerator = n; this.denominator = d; } } console.log(JSON.stringify(new Fraction(1, 2)))
这将输出{"numerator":1,"denominator":2}. 但是如果我们想用一个字符串替换它1/2呢?
进入 toJSON class Fraction { constructor(n, d) { this.numerator = n; this.denominator = d; } toJSON() { return `${this.numerator}/${this.denominator}` } } console.log(JSON.stringify(new Fraction(1, 2)))
JSON.stringify尊重toJSON财产和产出"1/2"。 4. 恢复数据
我们上面的分数示例效果很好。但是如果我们想恢复数据呢?当我们再次解析 JSON 时,如果分数能神奇地返回,那不是很酷吗?我们可以!
进入复活者! class Fraction { constructor(n, d) { this.numerator = n; this.denominator = d; } toJSON() { return `${this.numerator}/${this.denominator}` } static fromJSON(key, value) { if (typeof value === "string") { const parts = value.split("/").map(Number); if (parts.length === 2) return new Fraction(parts); } return value; } } const fraction = new Fraction(1, 2); const stringified = JSON.stringify(fraction); console.log(stringified); // "1/2" const revived = JSON.parse(stringified, Fraction.fromJSON); console.log(revived); // Fraction { numerator: 1, denominator: 2 }
我们可以传递第二个参数JSON.parse来指定 reviver 函数。恢复器的工作是将字符串化数据"恢复"回其原始形式。在这里,我们传递了一个 reviver,它是类的静态fromJSON属性Fraction。
在这种情况下,reviver 检查该值是否是一个有效的分数,如果是,它会创建一个新Fraction对象并返回它。
有趣的事实:此功能用于内置的 Date 对象。尝试查找Date.prototype.toJSON
这就是为什么它有效: console.log(JSON.stringify(new Date())) //=> ""2022-03-01T06:28:41.308Z""
要恢复日期,我们可以使用JSON.parse: function reviveDate(key, value) { const regex = /^d{4}-d{2}-d{2}Td{2}:d{2}:d{2}(.d{1,}|)Z$/; if (typeof value === "string" && regex.test(value)) { return new Date(value); } return value; } console.log(JSON.parse(""2022-03-01T06:28:41.308Z"", reviveDate)) //=> Tue Mar 01 2022 06:28:41 GMT-0700 (Pacific Daylight Time) 5.使用revivers隐藏数据
与解析器一样,恢复器也可用于隐藏数据。它以相同的方式工作。
这是一个例子: const user = JSON.stringify({ name: "John", password: "12345", age: 30 }); console.log(JSON.parse(user, (key, value) => { if (key === "password") { return; } return value; }));
这是输出:
{ name: "John", age: 30 }
专注音质阻击评价JEETMARS真无线蓝牙耳机前言蓝牙耳机现在是年轻人的标配,手机的更新换代加剧了行业的进化,尤其AirPods的产品线不断的推陈出新,Pro的发布和廉价版的AirPodslite让苹果赚的盆满钵满,让一众耳机
侧耳倾听无拘无束南卡NANKT2真无线蓝牙耳前言随着智能设备的普及,越来越多的人开始使用蓝牙耳机。蓝牙耳机有着高效的利用率,不用受到线材的束缚和使用的便利性,有着传统耳机不可替代的优越性。同时携带更加方便,不像传统耳机一样有
简单实用,方便便捷雷柏VM700蓝牙TWS耳机前言蓝牙耳机现在在市面上可以说是人手一副,而雷柏耳机作为国内知名外设厂商,当然不能错过,而且雷柏的产品更新还挺快,之前也用过不少雷柏的产品,对其品牌认可度还是挺高的。同时其产品的定
好茶好杯,一品香茗国瓷红官窑贵妃杯前言虽然不算一个标准的茶罐子,但是从小到大喝的茶还是挺多的,尤其由其父辈们那一代都是喝茶一路喝茶喝过来的,无论茶叶的好坏,淡茶,浓茶,苦茶,花茶,总有一款适合自己的茶。总之一碗热茶
轻巧便利辅助护眼米物智睿屏幕挂灯前言随着现在网络的普及和大众使用电脑频率的增加,网上购物,直播,游戏,工作,加班,画图,设计等都离不开电脑的使用,高强度的使用眼睛会导致眼睛干涩或者是视力下降导致近视眼的频发,所以
看家护院夜视为王华晟HSCP21POE家用摄像头前言经常出差或者长期不在家的特定人群,常常身在曹营心在汉,时刻担心空置的家庭中的各种情况,出门之前如果忘记关水管或者门窗那就得天天挂念,天气稍稍降温就要担心是否爆水管,风大是否窗户
先声入耳千元品质JEETMARS真无线蓝牙耳机前言随着AirPodsPro的发布,蓝牙耳机的普及被越来越多的人重视,更舒适的佩戴方法,无拘束的佩戴体验,一下子让蓝牙耳机走进了大众的视野中,而手机更新换代中。已经慢慢取消的耳机插
解放双手无限畅玩PS4手柄智能侧键DS200前言随着PS5的热卖,SONY游戏机又一次登上了热门搜索,而这次不光光是一货难求的PS5,更是把这个平常不常出现大众视野的主机带上聚光灯下,然后PS5作为首发最强主机却没有一部可以
发随风动保湿定性Lowrarouge罗拉家用电吹风筒前言头发是人类这一生必不可少的天然装饰,除去几乎微乎及微的保护头皮,保暖散热之外的功能,更多的意义就是吸引异性,当代男女不管是谁都希望拥有一头秀丽滋润的健康头发,发丝清爽,头皮不油
魅族最后一台联发科旗舰魅族Pro6S序言曾经在黄章的带领下,魅族一跃成为国产手机的巨头。从早期一个做MP3的小公司,凭着敏锐的商业嗅觉,在MP3还是如日中天的情况下,毅然在08年全面转型到手机行列。依靠早期MP3的市
跑步爱好者必备入门耳机南卡RunnerCCII骨传导运动耳机前言现在满大街都是蓝牙耳机大天下,如何选择一款适合自己的耳机相信是每个消费者都需要权衡的,而不同的是消费者的需求,有的人喜欢音质好的,有的人喜欢降噪,有的人喜欢传输稳定,当然还有人
一加8Pro发布会不用看了???日前,一加8系列官宣将于4月16日晚上19点发布,具体发布的日期越来越近,更多规格也被官宣,由于一加8系列预热2K120Hz屏,续航如何也是大家最关注的官方预热一加8系列全系标配单
限电令至,家居行业最贵的冬天到了吗?近期,不少制造业大省以及原材料大省,以控碳的名义,下发了能耗双控的相关政策文件,我国多地均相应出台了限电政策,要求工厂产能下降20,很多家居企业对此猝不及防,水泥陶瓷钢铁等高耗高污
厨房墙砖怎么选?这篇攻略告诉你厨房是一个实用性很强的地方,因此不会侧重于装饰上,想要拥有颜值高的厨房,可以从厨房墙砖下手,因此厨房墙砖的种类及如何挑选就非常重要了。一厨房墙砖哪种好?1亚光砖厨房墙砖可以选择亚光
4月即将到来的发布会,你更期待哪一个4月即将到来的发布会汇总,大家最期待哪款4月8日华为P40国行发布会4月9日荣耀Play4T系列4月13日OPPOAce24月15日荣耀30系列4月15日?魅族17系列4月16日一
倒计时!11。67南京家博会免费门票领取指南南京家博会,是蓝装家博会在南京地区的简称,蓝装家博会是以家装,家具,建材,卫浴,陶瓷,软装等为主题的家装博览会,包含所有家装采购所有品类,是为装修业主提供一站式服务的大型展会。家博
展会进行时,大连第9届蓝装家博会,速来围观中秋小长假怎么过?2021年9月1920日大连第9届蓝装家博会已拉开帷幕,正在给大连广大市民献上一场家装盛宴,小长假到家博会现场,相信能给您带来别样家博会,满足您对家的所有期许!9
喜报!大连第9届蓝装家博会完美收官秋天是一个收获的季节,是金色的季节,大连第9届蓝装家博会(9月1921日)在大连世界博览中心(会展二期)圆满落下帷幕。展会呈现定位准平台佳局部全活动多服务专安全稳等亮点,整体品质进
探究马桶二三事,建议读完全文,对你有用家装,最重要的就是提高家庭的生活品质,住所不只是日常作息的,而是更有幸福感的家。马桶作为日常生活所需,有着极其重要的作用。市面上有千万种马桶种类,产品价格和使用功能有着天壤之别,那
新房装修卫生间马桶出现反味怎么解决?马桶这个白白亮亮的洁具,可以说是卫生间的重点嘉宾,非常常用的一个东西。今天小蓝就跟大家聊聊新房装修卫生间马桶出现臭味怎么处理?说到马桶反味的原因,通常有四点1马桶密封胶,2马桶水封
刚装完的新房,马桶竟然出现臭味?解决方法在这卫生间马桶,家家必备之物。刚装完的新房,卫生间马桶竟然出现臭味,常常让人摸不着头脑。新房装修如果遇到卫生间马桶反味,该怎么办?倘若你家也出现这种情况,建议你先找原因,再对症改造。今
截止上半年全球独角兽企业超过600家,估值近2万亿美元据crunchbase最新统计,截至6月28日,全球独角兽企业已经达到601家,累计融资4420亿美元,估值1。98万亿美元。这些企业的平均融资额达到7。35亿美元,平均估值为33