JSON入门指南:从零开始掌握数据交换格式

引言

JSON,全称JavaScript对象表示法,是一种轻量级的数据交换格式。顾名思义,JSON起源于JavaScript编程语言,但其通用性使其能够被包括Python、Ruby、PHP和Java在内的多种编程语言广泛使用。通常,JSON的发音类似于英文名字“Jason”。

JSON以其出色的可读性和简洁性而著称,是XML的理想替代方案,且所需格式化工作更少。本指南将深入探讨JSON文件中可使用的数据类型、其通用结构和语法规则。

理解JSON的语法与结构

当JSON独立存在时,通常使用.json作为文件扩展名。在其他文件格式中(例如.html),JSON可以作为字符串包含在引号内,或者被赋值给一个变量。JSON格式主要用于Web服务器与客户端(或浏览器)之间的数据传输。

一个JSON对象采用键值对的数据格式,并通常用大括号{}表示。在使用JSON时,您最常会在.json文件中遇到JSON对象,但它们也可以作为JSON对象或字符串存在于程序的上下文中。

以下是一个JSON对象的示例:

{
  "first_name" : "Sammy",
  "last_name" : "Shark",
  "location" : "Ocean",
  "online" : true,
  "followers" : 987 
}

尽管这只是一个简短的例子,JSON数据可以包含多行,但它清晰地展示了JSON格式通常由一对花括号{}构成,内部填充着键值对。大多数JSON中包含的数据最终都会被封装在一个JSON对象中。

键值对之间使用冒号:分隔,例如 "key" : "value"。每个键值对之间则使用逗号,分隔。因此,一个JSON列表的中间部分会是这样的:"key" : "value", "key" : "value", "key": "value"。在上述示例中,第一个键值对是 "first_name" : "Sammy"

JSON键位于冒号的左侧。它们必须用双引号""括起来,例如 "key",并且可以是任何有效的字符串。在一个对象中,键必须是唯一的。这些键字符串可以包含空格,例如 "first name",但在编程时这样可能会更难访问,因此推荐使用下划线,例如 "first_name"

JSON值位于冒号的右侧。从细粒度层面来看,这些值必须是以下六种数据类型之一:

  • 字符串(strings)
  • 数字(numbers)
  • 对象(objects)
  • 数组(arrays)
  • 布尔值(Booleans,即true或false)
  • 空值(null)

从更广义的层面来看,值也可以由JSON对象或数组等复杂数据类型组成,这将在下一节中详细讨论。

作为值传入JSON的每种数据类型都将保持其自身的语法,这意味着字符串会用引号括起来,而数字则不会。

使用.json文件时,通常会将格式扩展到多行以提高可读性,但JSON也可以全部写在一行中,如下例所示:

{ "first_name" : "Sammy", "last_name": "Shark",  "online" : true, }

当您在其他文件类型中或遇到JSON字符串时,这种情况更为普遍。

在多行上编写JSON格式通常使其更易读,尤其是在处理大型数据集时。由于JSON会忽略其元素之间的空白,您可以在冒号和键值对之间加入空格,以使数据更容易被人类阅读。

{ 
  "first_name"  :  "Sammy", 
  "last_name"   :  "Shark", 
  "online"      :  true 
}

需要注意的是,尽管它们看起来很相似,但JSON对象与JavaScript对象的格式有所不同。因此,尽管您可以在JavaScript对象中使用函数,但在JSON中不能将其用作值。JSON最重要的特性是能够以所有参与的编程语言都能处理的格式快速传输数据。相比之下,JavaScript对象只能通过JavaScript编程语言直接处理。

JSON可以通过嵌套的对象和数组构成层级结构,从而变得越来越复杂。接下来,您将学习更多关于这些复杂结构的知识。

在JSON中使用复杂类型

除了嵌套数组,JSON还可以以JSON格式存储嵌套对象。这些对象和数组将作为分配给键的值传递,并且它们本身也可以由键值对组成。

嵌套对象

在下面的users.json文件中,对于每个用户(“sammy”、“jesse”、“drew”、“jamie”),都有一个嵌套的JSON对象作为它们的值,其中包含与每个用户相关的自己的嵌套键“username”和“location”。以下代码块中的每个用户条目都是一个嵌套JSON对象的示例。

用户.json
{
  "sammy" : {
    "username"  : "SammyShark",
    "location"  : "Indian Ocean",
    "online"    : true,
    "followers" : 987
  },
  "jesse" : {
    "username"  : "JesseOctopus",
    "location"  : "Pacific Ocean",
    "online"    : false,
    "followers" : 432
  },
  "drew" : {
    "username"  : "DrewSquid",
    "location"  : "Atlantic Ocean",
    "online"    : false,
    "followers" : 321
  },
  "jamie" : {
    "username"  : "JamieMantisShrimp",
    "location"  : "Pacific Ocean",
    "online"    : true,
    "followers" : 654
  }
}

在这个例子中,使用花括号构成了一个嵌套的JSON对象,其中包含了四个用户的相关用户名和位置数据。和其他值一样,当使用对象时,逗号被用来分隔元素。

嵌套数组

数据也可以通过使用JavaScript数组嵌套在JSON格式中作为值进行传递。JavaScript在数组类型的两端使用方括号[]。数组是有序集合,可以包含不同数据类型的值。

例如,当处理可以分组在一起的大量数据时,您可以使用数组,比如当一个用户关联着各种网站和社交媒体资料时。

通过第一个嵌套数组,“Sammy”的用户个人资料可以表示如下:

用户个人资料.json
{ 
  "first_name" : "Sammy",
  "last_name" : "Shark",
  "location" : "Ocean",
  "websites" : [
    {
      "description" : "工作",
      "URL" : "https://www.digitalocean.com/"
    },
    {
      "description" : "教程",
      "URL" : "https://www.digitalocean.com/community/tutorials"
    }
  ],
  "social_media" : [
    {
      "description" : "推特",
      "link" : "https://twitter.com/digitalocean"
    },
    {
      "description" : "脸书",
      "link" : "https://www.facebook.com/Silicon CloudCloudHosting"
    },
    {
      "description" : "GitHub",
      "link" : "https://github.com/digitalocean"
    }
  ]
}

“websites”键和“social_media”键分别使用一个数组来嵌套属于Sammy的两个网站链接和三个社交媒体个人资料链接的信息。您可以通过方括号的使用来识别它们是数组。

在您的JSON格式中使用嵌套可以让您处理更复杂和具有层次结构的数据。

比较JSON和XML

XML,即可扩展标记语言(eXtensible Markup Language),是一种存储可由人类和机器读取的访问数据的方式。XML格式可在许多编程语言中使用。

在许多方面,XML与JSON相似,但它需要更多的文本,导致读写所需时间更长,并且需要更多的解析器来解析XML,而JSON则可以使用标准函数进行解析。此外,与JSON不同,XML不能使用数组。

这里是XML格式的一个示例。

用户.xml

这是文章《JSON简介》的第3部分(共4部分)。

内容片段:

<users>
    <user>
        <username>SammyShark</username> <location>Indian Ocean</location>
    </user>
    <user>
        <username>JesseOctopus</username> <location>Pacific Ocean</location>
    </user>
    <user>
        <username>DrewSquir</username> <location>Atlantic Ocean</location>
    </user>
    <user>
        <username>JamieMantisShrimp</username> <location>Pacific Ocean</location>
    </user>
</users>

现在,比较以JSON格式呈现的相同数据。

用户.json
{"users": [
  {"username" : "SammyShark", "location" : "Indian Ocean"},
  {"username" : "JesseOctopus", "location" : "Pacific Ocean"},
  {"username" : "DrewSquid", "location" : "Atlantic Ocean"},
  {"username" : "JamieMantisShrimp", "location" : "Pacific Ocean"}
] }

JSON比XML更加紧凑,并且不需要结束标签。此外,与XML不同的是,XML没有像JSON这个例子中使用数组(通过方括号可以看出)。

如果你熟悉HTML,你会注意到XML在使用标记的方式上非常相似。虽然JSON比XML更简洁、更紧凑,并且在许多情况下,包括Ajax应用程序中能实现更快的处理速度,但在决定使用何种数据结构之前,首先要了解你正在处理的项目类型。

结论

JSON是一种轻量级的数据格式,可以用于分享、存储和处理数据。作为一种数据格式,JSON在API中得到了越来越多的支持,包括Twitter API。JSON也是JavaScript中原生的格式,并且在许多流行的编程语言中都有大量可用的实现。你可以在“介绍JSON”网站上阅读完整的语言支持信息。

由于你很可能不会自己创建.json文件,而是从其他来源获取它们,因此重要的是理解JSON的结构,而不是如何在程序中最好地使用JSON。例如,你可以使用开源工具“Mr. Data Converter”将电子表格程序中的CSV或制表符分隔数据转换为JSON。你还可以使用遵循知识共享许可的“utilities-online.info”网站将XML转换为JSON,反之亦然。

最后,当将其他数据类型转换为JSON,或者创建自己的JSON时,你可以使用JSONLint来验证你的JSON,并且可以在网页开发环境中使用JSFiddle来测试你的JSON。

bannerAds