JSON 是什么

发布于 2023-08-09 17:35:02 字数 4178 浏览 29 评论 0

提起 JSON,作为如今最受欢迎的数据交换格式,可以说是无人不知、无人不晓了。

JSON 全称 JavaScript Object Notation( JS 对象简谱),自诞生之初的小目标就是为了取代 XML 的江湖地位,短短几年,凭借其简洁易用的特性,早就实现了当初的小目标。最近微信支付的数据格式从最初的 XML 更新为 JSON 也算是迷途知返了 。

因为 JavaScript 语言本身具有很明显 C 语言风格,导致 JSON 也保持了 C 系语言的习惯,熟悉 C 语言、Java、Python 等语言的开发人员可以很容易的接受 JSON。

JSON 的核心思想之一就是 轻量化 ,但是 keep it simple 说起容易,做起来难。今天就仔细研究一下 JSON 的标准到底怎样简洁,看看其广受欢迎的背后原因。

0. 概述

JSON 定义了 6 种数据类型,分别是 null、boolean(包括 true,false)、number、string、array 以及 object。其中前四个是基本类型,后两个为数据集合。

下面就借助编译里面经常用到的有穷状态机,详细的介绍一下 JSON 的数据类型。

1. null、true 和 false

null 是 JS 中一个特殊的空对象,而且也很容易映射到其他语言,比如 Python 中的 None。

boolean 类型的两个值 true 和 false,同 null 一样,也很直观。

null、true、false,这三个类型的状态机相对简单,都是按照字母拼写的直线。

2. number

number 的状态机就比较复杂了

本来 JavaScript 里面表示数值只有 number 一种类型,没有区分 int 跟 float ,JSON 更进一步,规定其中的数值只能是十进制数,其形式包含可选的负号、整数部分、可选的小数部分、可选的指数部分。

因为 number 的状态机比较复杂,这里给出对应的正则表达式,可以跟状态机一起加深理解:

-?([0]|([1-9]\d*))(\.\d*)?([eE][-+]?\d*)?

3. String

相较于 JS 宽松的语言规范,**JSON 对 string 做出了更严格的限制,要求其只能被双引号(")包裹。**但是相较于 C 语言需要严格区分字符和字符串,JSON 又显得宽松许多,双引号包裹的零个或者一个字符都是正确的 string。特殊字符可以使用反斜线(\)进行转义,比如换行符(\n)。

需要注意的是关于 Unicode 的表示,由于 Unicode 的码点范围为 0 至 0x10FFFF,对于超过 0xFFFF 的码点在 JSON 里需要高低位两组 "\uXXXX" 来表示:如果第一个码点是 0xD800 至 0xDBFF,我们便知道它的代码对的高代理项(high surrogate),之后应该伴随一个 0xDC00 至 0xDFFF 的低代理项(low surrogate)。其转换规则如下:

codepoint = 0x10000 + (高位 − 0xD800) × 0x400 + (低位 − 0xDC00)

4. array

array 是值的有序集合,其中值可以为任何合法的 JSON 类型。一个 array 以左中括号([)开始, 右中括号(])结束。多个值之间使用 逗号(,) 分隔。

array 在许多语言中都有含义相似的集合形式,比如 Java 的 List 。

5. object

object,即对象,是一个无序的 ‘键/值’对 集合。一个对象以左大括号( {) 开始, 右大括号(}) 结束。 键 跟 值 之间使用冒号 (:)分割,多个 ‘键/值’对 之间使用逗号( ,) 分隔。

JSON 的对象就是哈希表,在很多编程语言里面都有对应的内置结构,只不过是 JSON 要求 key 必须为字符串。

6. 总结

一个合法的 JSON 串为可选的空白符包裹任意值类型。其中空白符的范围限定于:空格、换行(\n)、回车(\r)和制表符(\t)。集合类型的值之间是可以任意嵌套的。

了解了标准规范会发现 JSON 真的确实简单,不过话又说回来,我们也要了解 JSON 也并非完美无缺的,举个例子:因为 JSON 只有词法特性,没有语法特性,所以通信双方的协商就显得特别关键。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

柏林苍穹下

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文