第 23 章 JSON
第 23 章 JSON
23.1 语法
JSON 语法支持表示 3 种类型的值。
❑ 简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,就像在 JavaScript 中一样。特殊值 undefined 不可以。
❑ 对象:第一种复杂数据类型,对象表示有序键/值对。每个值可以是简单值,也可以是复杂类型。
❑ 数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型,包括简单值、对象,甚至其他数组。
23.1.1 简单值
最简单的 JSON 可以是一个数值,也可以是一个字符串,JavaScript 字符串与 JSON 字符串的主要区别是,JSON 字符串必须使用双引号(单引号会导致语法错误)。布尔值和 null 本身也是有效的 JSON 值。
23.1.2 对象
JSON 中的对象必须使用双引号把属性名包围起来。
与 JavaScript 对象字面量相比,JSON 主要有两处不同。首先,没有变量声明(JSON 中没有变量)。其次,最后没有分号(不需要,因为不是 JavaScript 语句)。同样,用引号将属性名包围起来才是有效的 JSON。属性的值可以是简单值或复杂数据类型值,后者可以在对象中再嵌入对象。
23.1.3 数组
23.2 解析与序列化
23.2.1 JSON 对象
JSON 对象有两个方法:stringify()和 parse()。在简单的情况下,这两个方法分别可以将 JavaScript 序列化为 JSON 字符串,以及将 JSON 解析为原生 JavaScript 值。
在序列化 JavaScript 对象时,所有函数和原型成员都会有意地在结果中省略。此外,值为 undefined 的任何属性也会被跳过。最终得到的就是所有实例属性均为有效 JSON 数据类型的表示。
23.2.2 序列化选项
JSON.stringify()方法除了要序列化的对象,还可以接收两个参数。这两个参数可以用于指定其他序列化 JavaScript 对象的方式。第一个参数是过滤器,可以是数组或函数;第二个参数是用于缩进结果 JSON 字符串的选项。
1.过滤结果
如果第二个参数是一个数组,那么 JSON.stringify()返回的结果只会包含该数组中列出的对象属性。
let book = {title: 'Professional JavaScript',authors: ['Nicholas C. Zakas', 'Matt Frisbie'],edition: 4,year: 2017
}
let jsonText = JSON.stringify(book, ['title', 'edition']) // '{"title":"Professional JavaScript","edition":4}'
如果第二个参数是一个函数,则行为又有不同。提供的函数接收两个参数:属性名(key)和属性值(value)。
let book = {title: 'Professional JavaScript',authors: ['Nicholas C. Zakas', 'Matt Frisbie'],edition: 4,year: 2017
}
let jsonText = JSON.stringify(book, (key, value) => {switch (key) {case 'authors':return value.join(',')case 'year':return 5000case 'edition':return undefineddefault:return value}
})
// '{"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt Frisbie","year":5000}'
2.字符串缩进
JSON.stringify()方法的第三个参数控制缩进和空格。在这个参数是数值时,表示每一级缩进的空格数。
let book = {title: 'Professional JavaScript',authors: ['Nicholas C. Zakas', 'Matt Frisbie'],edition: 4,year: 2017
}
let jsonText = JSON.stringify(book, null, 4)
// '{\n' +
// ' "title": "Professional JavaScript",\n' +
// ' "authors": [\n' +
// ' "Nicholas C. Zakas",\n' +
// ' "Matt Frisbie"\n' +
// ' ],\n' +
// ' "edition": 4,\n' +
// ' "year": 2017\n' +
// '}'
注意,除了缩进,JSON.stringify()方法还为方便阅读插入了换行符。这个行为对于所有有效的缩进参数都会发生。(只缩进不换行也没什么用。)最大缩进值为 10,大于 10 的值会自动设置为 10。
如果缩进参数是一个字符串而非数值,那么 JSON 字符串中就会使用这个字符串而不是空格来缩进。使用字符串时同样有 10 个字符的长度限制。如果字符串长度超过 10,则会在第 10 个字符处截断。
3.toJSON()方法
let book = {title: 'Professional JavaScript',authors: ['Nicholas C. Zakas', 'Matt Frisbie'],edition: 4,year: 2017,toJSON: function () {return this.title}
}
let jsonText = JSON.stringify(book) // '"Professional JavaScript"'
toJSON()方法可以与过滤函数一起使用,因此理解不同序列化流程的顺序非常重要。在把对象传给 JSON.stringify()时会执行如下步骤。
(1)如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
(2)如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
(3)第(2)步返回的每个值都会相应地进行序列化。
(4)如果提供了第三个参数,则相应地进行缩进。
23.2.3 解析选项
JSON.parse()方法也可以接收一个额外的参数,这个函数会针对每个键/值对都调用一次。为区别于传给 JSON.stringify()的起过滤作用的替代函数(replacer),这个函数被称为还原函数(reviver)。实际上它们的格式完全一样,即还原函数也接收两个参数,属性名(key)和属性值(value),另外也需要返回值。
如果还原函数返回 undefined,则结果中就会删除相应的键。如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。
let book = {title: 'Professional JavaScript',authors: ['Nicholas C. Zakas', 'Matt Frisbie'],edition: 4,year: 2017,releaseDate: new Date(2017, 11, 1)
}
let jsonText = JSON.stringify(book)
let bookCopy = JSON.parse(jsonText, (key, value) => (key == 'releaseDate' ? new Date(value) : value))
console.log(bookCopy.releaseDate.getFullYear()) // 2017
相关文章:
第 23 章 JSON
第 23 章 JSON 23.1 语法 JSON 语法支持表示 3 种类型的值。 ❑ 简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,就像在 JavaScript 中一样。特殊值 undefined 不可以。 ❑ 对象:第一种复杂数据类型,对象表示有序键/值…...
Java 正则表达式入门与应用(详细版)
正则表达式(Regular Expression,简称Regex)是一种文本模式匹配工具,在许多编程语言中都得到了广泛应用。Java 作为一种强大的编程语言,提供了对正则表达式的内建支持,使得在字符串处理、数据验证和文本解析…...
洛谷:P1540 [NOIP2010 提高组] 机器翻译
[NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于…...
基于AT89C51单片机的可暂停八路抢答器设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90196607?spm1001.2014.3001.5503 C15 部分参考设计如下: 摘要 随着社会进步和科技发展,电子设备在各类活动中的应用日益普遍,…...
面试题解,Java中的“对象”剖析
一、说一说JVM中对象的内存布局?new一个对象到底占多大内存? 话不多说,看下图,对象的内存布局图 一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance D…...
行为模式3.迭代器模式
行为型模式 模板方法模式(Template Method Pattern)命令模式(Command Pattern)迭代器模式(Iterator Pattern)观察者模式(Observer Pattern)中介者模式(Mediator Pattern…...
第8章 DMA控制器
DMA的基本概念 DMA是用硬件实现不再通过CPU的,计算机内存储器与I/O设备之间的直接数据传送技术。该硬件称为DMA控制器(简称DMAC),用来控制数据的输入和输出,复杂性堪比CPU。 DMA方式可实现: 数据存储器RAM→I/O端口的DMA读传送I/O…...
后端java开发路由接口并部署服务器(四)
一、安装IntelliJ IDEA,安装包下载 1、官网下载 2、网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 打开IntelliJ IDEA,输入网盘资源文件内容 三、汉化处理 插件搜索chinese,就会找到相应的插件安装重启软件即可 四、新建后端j…...
检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?
论文地址:https://arxiv.org/pdf/2403.05313 Github地址:https://github.com/CraftJarvis/RAT 想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是࿰…...
在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)
文章目录 1. 什么是聚合列?2. 什么是非聚合列?3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中?5. 如何判断一个列是聚合列还是非聚合列?6. 总结 在 SQL 中&#…...
单元测试3.0+ @RunWith(JMockit.class)+mock+injectable+Expectations
Jmockit使用笔记_基本功能使用Tested_Injectable_Mocked_Expectations_jmockit.class-CSDN博客 静态变量直接赋值就好,没必要mock了 测试框架Jmockit集合junit使用 RunWith(JMockit.class) 写在测试案例类上的注解 Tested 在测试案例中,写在我们要测试的类上…...
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
一:步进电机简介 步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正…...
MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 论文解读
目录 一、概述 二、相关工作 三、前置知识 1、LVDM Introduction 2、LVDM Method 3、LVDM for Short Video Generation 4、Hierarchical LVDM for Long Video Generation 5、训练细节 6、推理过程 四、MotionCtrl 1、CMCM 2、OMCM 3、训练策略 五、实验 一、概述…...
LINUX线程操作
文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态(New)就绪状态(Runnable)运行状态(Running)阻塞状态(Blocked)死亡状态&#…...
在Lua中,Metatable元表如何操作?
Lua中的Metatable(元表)是一个强大的特性,它允许我们改变表(table)的行为。下面是对Lua中的Metatable元表的详细介绍,包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表,它用于…...
4D LUT: Learnable Context-Aware 4D LookupTable for Image Enhancement
摘要:图像增强旨在通过修饰色彩和色调来提高照片的审美视觉质量,是专业数码摄影的必备技术。 近年来,基于深度学习的图像增强算法取得了可喜的性能并越来越受欢迎。 然而,典型的努力尝试为所有像素的颜色转换构建统一的增强器。 它…...
瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)
瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp) RK3568及rkmpp介绍编译安装mpp获取源码交叉编译安装 libdrmlibdrm-2.4.89 make 方式编译(cannot find -lcairo, 不推荐)下载源码编译编译错误: multiple definition of `nouveau debug‘错误cannot find -lcairo:…...
使用SuperMap制作地形图的详细教程
一、数据准备 本示例以山东为例,演示如何通过SuperMap iDesktopX制作一个好看的地形图。所有数据均来源于互联网公开数据,如有自己项目真实数据,可直接跳过数据下载进入下一步。 本示例所需数据包括: 数据类别 数据类型 DEM数据…...
PHP Array:精通数组操作
PHP Array:精通数组操作 PHP,作为一门流行的服务器端编程语言,提供了强大的数组处理能力。数组是PHP中非常灵活和强大的数据结构,它可以存储多个相同类型的值。在PHP中,数组不仅可以存储数字,还可以存储字…...
【使用命令配置java环境变量永久生效与脚本切换jdk版本】
java配置环境变量命令与脚本切换jdk版本 新建用户环境变量永久生效 setx JAVA8_HOME "D:\Java\jdk8" setx JAVA17_HOME "d:\Java\jdk-17" setx JAVA_HOME %JAVA8_HOME% setx CLASSPATH ".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;"…...
从‘基’到‘坐标变换’:用Python和NumPy手把手理解线性空间的‘换地图’操作
从‘基’到‘坐标变换’:用Python和NumPy手把手理解线性空间的‘换地图’操作 想象一下,你正在使用导航软件规划路线。同一个地点,在高德地图和百度地图上显示的坐标可能完全不同——这就像线性代数中的基变换。本文将用Python代码和可视化手…...
零基础玩转CosyVoice:3步完成声音克隆,制作专属语音祝福
零基础玩转CosyVoice:3步完成声音克隆,制作专属语音祝福 1. 引言:让声音成为你的专属礼物 你有没有想过,用自己或亲友的声音,生成一段独一无二的语音祝福?比如,用妈妈的声音说“生日快乐”&am…...
告别拼写红线:Vim-galore教你打造专属拼写检查系统
告别拼写红线:Vim-galore教你打造专属拼写检查系统 【免费下载链接】vim-galore :mortar_board: All things Vim! 项目地址: https://gitcode.com/gh_mirrors/vi/vim-galore 你是否厌倦了在Vim中写作时不断出现的拼写错误红线?想要一个强大而灵活…...
网络工程师的日常:一次搞定eNSP中MSTP+VRRP的‘坑’与优化技巧
eNSP实战:MSTPVRRP组网中的典型故障排查与性能调优 凌晨两点,当我在eNSP模拟器中第三次看到"VRRP state transition to Backup"的日志时,咖啡杯已经见底。这个典型的双核心企业网架构本该在半小时内完成配置,却因为MSTP…...
Kronos时间序列预测模型全攻略:从技术原理到工业实践
Kronos时间序列预测模型全攻略:从技术原理到工业实践 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 问题:时间序列预测的行业痛点…...
如何将闲置Globe键重构为效率引擎?Karabiner-Elements自定义修饰键全指南
如何将闲置Globe键重构为效率引擎?Karabiner-Elements自定义修饰键全指南 【免费下载链接】Karabiner-Elements Karabiner-Elements is a powerful utility for keyboard customization on macOS Sierra (10.12) or later. 项目地址: https://gitcode.com/gh_mirr…...
如何快速掌握这款免费音乐歌词工具:3分钟搞定全网歌词批量下载与格式转换
如何快速掌握这款免费音乐歌词工具:3分钟搞定全网歌词批量下载与格式转换 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在数字音乐时代,你是否遇…...
全网最全JAVA面试八股文,终于整理完了
前言 今天为大家整理了目前互联网出现率最高的大厂面试题,所谓八股文也就是指文章的八个部分,文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成,题目一律出自四书五经中的原文。 而JAVA面试八股文也就是为了考验…...
别再死记硬背命令了!用eNSP模拟器搞懂三层交换的‘一次路由,多次交换’
从数据包视角拆解三层交换:用eNSP透视"一次路由多次交换"的本质 很多网络工程师能熟练配置三层交换,却说不清为什么第一个包慢、后续包快。这种现象背后,是硬件转发表(FIB)和邻接关系表的协同工作机制在发挥…...
Pixel Mind Decoder 跨平台调用演示:从微信小程序发送分析请求
Pixel Mind Decoder 跨平台调用演示:从微信小程序发送分析请求 1. 场景引入:为什么需要情绪分析功能 最近在开发一个社交类微信小程序时,遇到了一个有趣的需求:用户希望能在聊天过程中实时了解对方的情绪状态。想象一下…...
