其他分享
首页 > 其他分享> > 第2章 JSON语法

第2章 JSON语法

作者:互联网

2.1 JSON基于JavaScript对象字面量

在英语中,“literal'”(字面上的)是一个形容词,用来表示所说的话所表达的是其字面意思,不是隐喻。比如你的朋友对你说:“她不知从哪儿突然冒了出来,吓得我三明治都掉了。”他所说的“三明治掉了”就是字面意思,而不是隐喻。

而编程语言中的 literal(字面量)是一个名词。所谓字面量,是对数据值的具体表示。它的字面意思与其想要表达的意思是完全一致的。如果你对编程相关的概念不熟悉的话,可能会觉得有些奇怪。下面让我们快速了解字面量。

结账时你习惯用现金还是刷卡?假如我现在在三明治店准备结账,当我给收银员5美元现金时,我是眼睁睁看着钱从我的钱包“飞”走的;而当我刷卡结账时,虽然我没有亲眼看到,但是我也知道我的账户里少了5美元。

而在编程中,我们经常用变量来代表值。例如,我会在表达式中这样使用一个称为x的变量:

X=5

然后,我可能想让x加5:

X=X+5 

现在,虽然我们没有看到 10,但我们知道 x 的值变成 10 了。在这个示例中,x 就是变量,5 就是字面量。在前面举的三明治店的例子中,我们可以说 5 美元是字面量,信用卡是变量。我们看到的实际值,就是字面的值。

在 “x=5” 这个例子中,5 是一个数字字面量。数字是一种数据类型。还有一些其他的数据类型,如字符串(由字符组成)、布尔值(真或假)、(空)、值的集合,以及对象。我们使用数字来直观地表示一个数值。同样, 我们也会用 true/false0/1 来直观地表示布尔值。如果你熟悉对象的概念,那么你会知道对象的表示并不是一件容易或简单的事。不过放心,即使你对这个概念不熟悉,也不影响接下来的阅读。

编程中对象的概念和现实生活中的对象(比如你的鞋子)很相似。你可以用一些特征或属性,比如颜色、风格、品牌等,来描述你的鞋子。有些属性值可能是一个数字,如鞋号,有些可能是布尔值(真/假),比如“有蕾丝花边”。详见示例2-1。

示例2-1:使用 JSON 描述我现在穿的鞋子

{
   "brand": "Crocs",
   "color": "pink",
   "size": 9,
   "hasLaces": false
}

模仿上面,用 JSON 格式描述一下黄子涵:

{
   "name": "黄子涵",
   "age": "28",
   "height": "177cm",
   "nativePlace": "广东湛江"
}

现在先不要关注鞋子示例的语法。示例想表达的是, 程序(甚至是人)可以从字面上读出我的鞋子的一些属性。如果将这个用JSON来描述鞋子的示例视为字面量,其数据类型就是对象。我们发现,这种对象的字面量将属性用一种我们直接可见(且可读)的方式展现出来。

我们将这一对象的特征或属性所采用的表示方法称为 名称-值对。

JSON 是基于 JavaScript 对象字面量的。注意是“基于”。在 JavaScript (以及大多数包含对象概念的编程语言)中,对象里面常常包含函数。因此我不仅能直接使用 JavaScript 对象来表示鞋子的属性,还能创建一个叫“walk”的函数。而且,数据交换格式的核心是数据,所以 JSON 中并不会涉及 JavaScript 对象字面量中的函数。JSON 所基于的 JavaScript 对象字面量单纯指对象字面量及其属性的语法表示。这种属性表示方法也就是通过 名称-值对 来实现的。

2.2 名称-值对

在计算机界,名称-值对 的概念非常流行。它们也有别的名字,像 键-值对、属性-值对 或 字段-值对等。

如果你对 名称-值对 这一概念已经很熟悉了,那么 JSON 看上去也会很亲切。当然,不熟悉也没有关系。让我们来简单地了解一下 名称-值对。

在 名称-值对 中,你首先要声明一个名称,例如 "animal"。然后把它凑成一对:一个名称加一个值。我们来给这个名称(本例中的"animal")一个值。为简单起见,我们给它一个字符串类型的值。在 JSON 中,名称-值对 的值还可以是数字、布尔值、null、数组或对象。现在,我们给这个名称为 "animal" 的 名称-值对 加上一个字符串类型的值"cat":

"animal": "cat" 

"animal" 就是名称,"cat" 就是值。分隔名称和值的方式有很多。比如,现在我给你一份公司的雇员名录,其中包含他们的头衔,那这个列表很可能看上去像下面这样:

Bob Barker, CEO 
Janet Jackson, COO 
Mr.Ed, CFO

以上列表使用逗号来分隔员工头衔(名称)和姓名(值)。此外,我把值放在了左边,把名称放在了右边。JSON 中使用冒号(:)来分隔名称和值。名称始终在左侧,值始终在右侧。让我们再看一些例子:

"animal": "horse" 
"animal": "dog" 

很简单吧?一个名称加一个值,这就是 名称-值对。

2.3 正确的JSON语法

现在让我们来了解一下 JSON 的语法。名称,也就是我们示例中的 "animal" ,始终需要被双引号包裹。双引号中的名称可以是任何有效的字符串,所以你的名称即使看起来像下面这样,在 JSON 中也是完全合法的:

"My animal": "cat" 

你甚至可以在名称中使用单引号:

"Lindsay's animal": "cat" 

现在你知道这是合法的 JSON 了,但我还要再跟你多说一句:最好不要这么做。这是因为,JSON 中的名称-值对 是一种对许多系统都十分友好的数据结构,而使用空格和特殊字符(即 a~z 、0~9 除外的其他字符)忽略了可移植性。如果我们这么做的话,会直接降低 JSON 数据的可移植性;因此我们说,为了获得最大可移植性,应尽可能避免使用空格或特殊字符。

JSON 中的 名称-值对 的名称如果被系统作为对象装入内存的话,将会成为“属性”。在部分系统中,属性名可以包含下划线(_ ) 或数字,但是大多数情况下最好是使用英文字母 A~Z 或 a~z。所以,当我想在我的名称中使用多个单词时,我一般会这样写:

"lindsaysAnimal": "cat" 

或:

"myAnimal": "cat" 

示例中的 "cat" 值是被双引号包裹的。不过,不同于名称,值并不总是需要被双引号包裹。当值是字符串时,必须使用双引号。而在 JSON 中,还有数字、布尔值、数组、对象、null 等其他数据类型,这些都不应被双引号包裹。

JSON 的全称是 JavaScript 对象表示法。所以我们剩下的任务就是了解构建一个对象的语法。我们将花括号加在 名称-值对 的两边来使之成为一个对象。像下面这样,一个在前,一个在后:

"animal": "cat" 

当你在格式化 JSON 时,不妨想象一下骑士的册封仪式,封主会用剑在受封者的左右肩各轻点一下,使他自此成为一名真正的骑士。而现在你就是这个封主,你需要在两边点上花括号来使你的 JSON 成为一个对象。“JSON 先生,我在此封你为对象。”如果不在左右肩上用剑轻点,那么仪式便不是完整的。

在 JSON 中,多个 名称-值对 使用逗号来分隔。现在,让我们来扩充 “animal/cat” 示例,加入一种颜色:

{"animal": "cat","color": "orange"} 

我们也可以从读它的机器的角度去理解 JSON 的语法。和人不同,机器是严格遵守规则和指令的。当你在一个字符串类型的值外面使用下面这些字符时,实际上提供的是告诉机器如何读取数据的指令:

  • {(左花括号)指“开始读取对象”
  • }(右花括号)指“结束读取对象”
  • [(左方括号)指“开始读取数组”
  • ](右方括号)指“结束读取数组”
  • (冒号)指“在名称-值对中分隔名称和值”
  • (逗号)指“分隔对象中的名称-值对”或者“分隔数组中的值”;也可以认为是“一个新部分的开始”

如果你没有用右花括号来“结束读取对象”,那么你的对象将不会被解析成对象。如果你在 名称-值对 列表的结尾处加上一个逗号,你给机器的指令是“一个新部分的开始”,但是后面什么都没有。因此,时刻使用正确的语法十分重要。

小故事:JSON 的双引号

有一天,我无意间瞥见了一个学生的电脑屏幕。屏幕上显示着他即将拿去验证的 JSON(示例2-2)。

示例 2-2:不能通过验证的“JSON”

{
   title: "This is my title.", 
   body: "This is the body." 
}   

验证后,验证器抛出了一个解析错误。他感到很困惑,说:“你看嘛, 我写得没有错啊!”

我告诉他 "title" 和 "body" 的两边没有加上双引号。他说:“但是我见过在名称两边加引号和不加引号的两种JSON格式。” “哈,” 我说,“没有在名称两边加上双引号时,它并不是 JSON ,而是一个JavaScript 对象。”有这种困惑是可以理解的。JSON 是基于 JavaScript 对象字面量的,所以它们看起来很像。但是 JavaScript 对象字面量不需要给 名称-值对 中的名称两边加上双引号。而在 JSON 中,却是必须要加的。

另外一个让人困惑的,点是使用单引号代替双引号。在 JavaScript 中,一个对象允许使用单引号代替双引号(示例 2-3)。

示例 2-3:这不是合法的JSON

{
  'title': 'This is my title.', 
  'body': 'This is the body.'
}

在 JSON 中,我们仅使用双引号,而且对于 名称-值对 中的名称来说,它们是必需的(示例2-4)。

示例2-4:合法的JS0N

{
   "title": "This is my title.", 
   "body": "This is the body."
}

2.4 语法验证

机器不同,对我们这些敲键盘的人来说,只要少敲个字就能酿成错误。

我们没有创造比想象中更多的错误,真的是很神奇。所以当你在工作中使用 JSON 时,很重要的一点就是验证。

你使用的集成开发环境(integrated development environment,.IDE)也许会内置 JSON 的验证。如果内部没有集成,但是你的 IDE 支持插件的话,你应该也能找到相关的验证工具。如果你不使用 IDE ,甚至对我刚刚说的都一无所知,这也没有关系。

有许多在线工具可以帮助你格式化和验证 JSON 。在你常用的搜索引擎中搜索“JSON验证”就能得到许多结果。下面是一些值得一提的工具。

  • JSON Formatter Validator ( https://jsonformatter.curiousconcept.com/)
    这是一个带有配置选项、能够高亮错误且UI很棒的格式化工具。经过处理的JSON会显示在两个窗口,一个用于展示JSON的树/节点结构,类似于可视化工具,另一个用于复制/粘贴格式化后的代码。

image

  • JSON Editor Online (http://www.jsoneditoronline.org/
    这是一个集验证、格式化和可视化工具于一身的JSON工具。错误提示会显示在出错的那一行。除了验证以外,还会显示解析错误的详情。右边的可视化工具使用树/节点的形式来展示JSON。

image

  • JSONLint(http://jsonlint.com/
    这是一个毫不花哨的JSON验证工具。简单地复制、粘贴、验证即可。也可以友好地格式化你的JSON。

以上这些都是语法验证工具。语法验证关注的是 JSON 的格式,而一致性验证关注的是其独特的数据结构。比如我们对示例2-5进行验证,语法验证会检测我们的 JSON 语法是否正确(是否被花括号包裹,名称-值对 是否以逗号分隔), 而一致性验证会检测我们的数据中是否包含name、breed和age等信息。它还会检测 age 的值是不是数字,name 的值是不是字符串,等等。

示例2-5:验证示例

{
   "name": "Fluffy", 
   "breed": "Siamese", 
   "age": 2 
}

2.5 JSON文件

你可能会觉得在今后使用 JSON 时,仅能在代码中创建它并传输到一个仅可通过开发者工具来查看的不可见的世界。然而,JSON 这种数据交换格式是可以作为独立的文件存在于文件系统中的。它的文件扩展名非常好记:.json

因此,我可以将 “animal/cat” 保存到计算机中的一个 JSON 文件中,比如 C:/animals.json。

2.6 JSON 的媒体类型

当你在传递数据时,需要提前告知接收方数据是什么类型,这就会涉及媒体类型。媒体类型也有一些你可能听过的其他称呼,如 “互联网媒体类型” “内容类型” 或 “MME类型” 。它使用 “类型/子类型” 这种格式来表示,比如你可能见过的 text/htmL 。

JSON 的 MIME 类型是 application/json。

互联网数字分配机构(Internet Assigned Numbers Authority, IANA)维护着一个包含全部媒体类型的列表( http://www.iana.org/assignments/.media-types/media-types.xhtml)。

上面的地址已经失效了,现在的地址是:https://www.iana.org/

image

2.7 专业术语和概念

  • 字面量
    指字面意思与其想要表达的意思是完全一致的值。
  • 变量
    通过形如x的标识符来表示的、可以修改的一类值。
  • 最大可移植性(数据交换中) 通过保证数据本身对于平台和系统的兼容性来提供超越数据格式本身的可移植性。
  • 名称-值对
    指拥有名称和对应的值的属性或特征(也叫键-值对)。
  • 语法验证
    关注JSON格式的验证。
  • 一致性验证
    关注独特数据结构的验证。

我们还讨论了以下重要概念。

  • JSON 基于 JavaScript 对象字面量中表示属性的语法,但是并不包含与 JavaScript 对象字面量的函数相关的部分。
  • 在 JSON 的 名称-值对 中,名称始终被双引号包裹。
  • 在 JSON 的 名称-值对 中,值可以是字符串、数字、布尔值、null、对象或数组。
  • JSON 中的 名称-值对 列表被花括号包裹。
  • 在 JSON 中,多个 名称-值对 使用逗号分隔。
  • JSON 文件使用 .json 扩展名。
  • JSON 的媒体类型是 application/json。

标签:字面,示例,对象,验证,语法,JSON,名称
来源: https://www.cnblogs.com/Huang-zihan/p/16264025.html