为什么json属性名被设计为必须有引号?

JSON——JavaScript Object Notation,直译过来就是JavaScript对象标记法。
这是一种数据交换格式,简单来说,就像我们平时写收发地址一样,规定了一种大家都认同的格式,让数据在不同的系统之间传递得既安全又不会走丢。

首先,我们得聊聊历史,回到2000年左右,那时候互联网可比现在简单多了。
大家还在用XML作为标准的数据交换格式,XML——可扩展标记语言,它是标准通用标记语言的子集,XML的设计目的是传输和存储数据,它自身不做任何操作。
但是,XML太繁琐了,写起来一大堆标签,读起来也不方便,尤其是在网络传输上,特别占带宽。

&nbsp

这时,Douglas Crockford 站了出来,他提出了JSON,这一点灵感其实是来自于JavaScript语言中对象字面量的表示方法,你可以把它想象成一个轻量级的XML。
为什么说它轻量级呢?因为JSON的结构清晰,读写都很方便,对计算机来说也容易解析和生成,而且它的体积小,特别适合网络传输。

然后再来说说JSON为何要用双引号包裹属性名,这事儿得理清楚,简单地说,Douglas Crockford 在制定JSON标准时,是基于几个核心考虑的:
&nbsp

1. 历史原因和编码习惯

当时的JavaScript在对象字面量中是允许不用引号的,但是这样会带来一些问题,比如,如果你的属性名刚好是个JavaScript的保留字,那不加引号可能就会出错。
想想看,如果你有个属性叫class或者function,在JavaScript中这些都是特殊的词,有它们自己的意义,不可能随便用来当作别的东西的名字。
这时候,如果你不给classfunction这样的属性名加引号,程序就会一头雾水,不知道你是在定义一个新东西,还是在用它原来的意思。
所以,为了避免混淆,JSON格式规定所有属性名都得加上双引号,这样就不会有歧义了。

这也是为什么在JSON里,即使你的属性名不是保留字,也得乖乖地加上双引号。

2. 兼容性

JSON虽然源自JavaScript,但它是被设计成一种跨语言的数据格式。
这就意味着,不只是JavaScript,其他许多语言,比如Python、Ruby、Java,都得能读懂并处理JSON。
如果属性名有时候加引号有时候不加,那各种语言的解析器就得不停地猜测这个属性名到底是什么意思。
这就像你在不同的国家之间寄信,但是收发地址格式不统一,那邮差怎么可能不迷路呢?
所以,Douglas Crockford 决定让所有语言在解析JSON时都能有一个清晰、统一的标准:所有属性名都用双引号括起来,这样无论你用什么语言,解析JSON都是一样的流程。

&nbsp

3. 效率

现在来看看效率问题,计算机处理数据时,如果格式统一,它就能更快地识别和处理这些数据。
就像快递分拣,如果所有包裹的大小形状都一样,那分拣起来就比较方便和快速。
同理,在JSON中,如果所有属性名都用同样的方式标记——也就是双引号——计算机解析起来就容易多了。
它不需要去考虑各种复杂的情况,只要看到双引号就知道:“嘿,一个新属性来了!”这种明确的标记,大大加快了解析的速度。

4. 扩展性和未来兼容性

最后,来聊聊扩展性,在JSON中,属性名用双引号括起来,意味着你的属性名可以是任何字符,不管是空格,特殊符号,还是东方文字,都没问题。
这让JSON变得非常灵活,无论你的数据长什么样,都能用JSON来表示。
而且,这样的设计也意味着未来即使出现了新的需求或者新的编程语言,JSON也能够适应,因为它的格式已经足够通用了。

总结

所以,总结一下,Douglas Crockford 在设计JSON时,考虑了很多的因素。需要确保这种格式既要简单明了,又要能跟得上未来的发展。
现在回头看看,这样的设计确实是充满了远见。如今,JSON已经成为了互联网中数据交换的标准之一,无论是在配置文件、API交互,还是在各种应用程序中,你都能看到JSON的身影。

求一键三连:点赞、分享、收藏

创作不易,点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/398237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用go-llama.cpp 运行 yi-01-6b大模型,使用本地CPU运行,速度挺快的

1,视频地址 2,关于llama.cpp 项目 https://github.com/ggerganov/llama.cpp LaMA.cpp 项目是开发者 Georgi Gerganov 基于 Meta 释出的 LLaMA 模型(简易 Python 代码示例)手撸的纯 C/C 版本,用于模型推理。所谓推理…

Python之海象运算符

在 Python 3.8 及更高版本中,引入了一种新的语法特性,称为"海象运算符"(Walrus Operator),它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…

14. UE5 RPG使用GameplayTag

GameplayTag本来是应用在GAS游戏技能系统里面的,后来UE直接将其抽离出来,作为一个模块,现在可以不在GAS里也可以使用这个模块。比如,我需要判断一个射线拾取的物体,首先我需要判断这个actor是否存在,然后判…

torch.manual_seed(233333)

torch.manual_seed(233333) 介绍报错信息解决问题总结 介绍 这是在使用GPT-SoVITS时运行缺失pytorch导致报的错 报错信息 Traceback (most recent call last): File “D:\vits\GPT-SoVITS-beta\GPT-SoVITS-beta0217\webui.py”, line 10, in torch.m…

​ 安达发|APS排程软件的动态合并优化详解

在制造业中,为了提高生产效率、降低成本并满足客户需求,企业需要采用先进的人工智能算法APS系统。APS(高级计划与排程)系统作为一种强大的工具,可以帮助企业实现这一目标。本文将详细介绍APS排程软件的动态合并优化功能…

线阵相机之帧超时

1 帧超时的效果 在帧超时时间内相机若未采集完一张图像所需的行数,则相机会直接完成这张图像的采集,并自动将缺失行数补黑出图,机制有以下几种选择: 1. 丢弃整张补黑的图像 2. 保留补黑部分出图 3.丢弃补黑部分出图

Java线程池ThreadPoolExecutor运行机制和源码解析

线程池简介 线程的每次创建和销毁都会产生的一定的系统资源和时间的开销。正如几乎所有重资源都使用池化技术(数据库连接池、redis连接池等)进行管理,线程作为操作系统宝贵的资源,对它的使用需要进行控制管理,线程池就…

【前沿】头戴式光场显示技术研究进展

摘要:光场显示器旨在通过重建三维场景在不同方向发出的几何光线来渲染三维场景的视觉感知,从而为人的视觉系统提供自然舒适的视觉体验,解决传统平面立体三维显示器中的聚散调节冲突问题。近年来,多种光场显示方法被尝试应用到头戴…

特征选择、特征降维和特征提取到底有什么区别和联系?这篇文章一次性给你讲清楚!

目录 一、特征选择: 1.最大互信息系数(MIC): 2.互信息(MI): 3.最大相关最小冗余算法(mRMR): 4.支持向量机递归特征消除(SVM_RFE): 二、特征降维: 1.主成分分析(PCA): 2.核主成分分析(KP…

【数据结构/c++】求解有向无环图DAG的关键路径

#include<cstring>//memset头文件 #include<algorithm>//fill头文件 #include<vector> #include<stdio.h> #include<stack> #include<queue> using namespace std; const int MAXV510; struct Node{int v,w;Node(int _v,int _w):v(_v),…

【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定 文章目录 【.NET Core】常见C#代码约定一、概述二、代码预定的目标三、代码约束工具和分析器四、C#语言准则五、字符串约定5.1 使用字符串内插来连接短字符串5.2 插入大文本时&#xff0c;使用System.Text.StringBuilder对象 六、数组约定七、委托…

提升认知水平和防止偏见浅谈

提升认知水平和防止偏见浅谈 《庄子外物》&#xff1a;井蛙不可语海&#xff0c;夏虫不可语冰。 不要跟井底的青蛙谈论大海&#xff0c;因为它的认知只有井底那么大&#xff0c;大海对于它来说是认知盲区&#xff1b;不要与夏虫去谈论冰雪&#xff0c;因为夏虫一生很短没有经历…

springboot203医疗挂号管理系统

医疗挂号管理系统设计与实现 摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医…

摄像设备+nginx+rtmp服务器

前言 由于html中的video现在不支持rtmp协议(需要重写播放器框架&#xff0c;flash被一刀切&#xff0c;360浏览器还在支持flash),遂用rtmp作为桥梁,实际是hls协议在html中起作用. 在此推荐一款前端播放器,.ckplayer 简直了,写点页面,一直循环&#xff0c;洗脑神曲 dream it po…

spring boot3参数校验基本用法

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 前言 导入依赖 使用介绍 配置检验规则 开启校验 使用注意 全局异常捕获返回友好提示信息 常用的校…

Sparse MLP

上图展示了本文网络的整体架构。与ViT、MLP-Mixer和Swin Transformer类似&#xff0c;空间分辨率为HW的输入图像被分割为不重叠的patch。作者在网络中采用了44的patch大小&#xff0c;每个patch被reshape成一个48维的向量&#xff0c;然后由一个线性层映射到一个c维embedding i…

可解决95%以上问题的Linux命令!能用到退休

对于我们程序员来说&#xff0c;我们始终绕不过去要与 Linux 系统打交道。很多人&#xff0c;特别是新手程序员&#xff0c;一看到 Linux 系统那个小黑框&#xff0c;就发怵&#xff0c;其实&#xff0c;如果你真正去深入了解了&#xff0c;然后再学会一些常用的命令&#xff0…

网络入山太困难?看格行随身WiFi如何助力大山教育!

近日&#xff0c;一则关于偏远大山的上网问题冲上了热搜&#xff0c;引发了社会关注。虽然很多山区都已经通了电、通了网&#xff0c;但是在一些贫困的地区&#xff0c;网络基础设施依旧薄弱&#xff0c;村民想要使用固定宽带&#xff0c;仍然十分困难。 而在山区的学生们&…

每日OJ题_二叉树dfs②_力扣129. 求根节点到叶节点数字之和

目录 力扣129. 求根节点到叶节点数字之和 解析代码 力扣129. 求根节点到叶节点数字之和 129. 求根节点到叶节点数字之和 难度 中等 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&am…

Unable to make field private JavacProcessingEnvironment$DiscoveredPro报错解决办法

maven项目打包报错 报错信息 Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not &q…