JSON是什么

2023-05-16

提起 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 只有词法特性,没有语法特性,所以通信双方的协商就显得特别关键。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON是什么 的相关文章

随机推荐

  • 微波遥感(三、SAR图像特征)

    SAR 是主 动式侧视雷达系统 xff0c 且成像几何属于斜距投影类型 因此 SAR 图像与光学图像在成像机理 几何特征 辐射特征等方面都有较大的区别 在进行 SAR 图像处理和应用前 xff0c 需要了解 SAR 图像的基本特征 本文主要
  • 基于Slicing Aided Hyper Inference (SAHI)做小目标检测

    遥感等领域数据大图像检测时 xff0c 直接对大图检测会严重影响精度 xff0c 而通用工具多不能友好支持大图分块检测 Slicing Aided Hyper Inference SAHI 是一个用于辅助大图切片检测预测的包 目前可以良好的
  • YOLOv5训练参数简介

    YOLOv5参数解析 xff0c 这次主要解析源码中train py文件中包含的参数 1 1 39 weights 39 1 2 39 cfg 39 1 3 39 data 39 1 4 39 hyp 39 1 5 39 epochs 39
  • 亚米级土耳其地震影像数据下载

    下载地址1 xff0c 提供震前震后影像 部分震后影像的百度网盘存档 xff1a https pan baidu com s 1 rLV7cR F3casKRwQH7JTw 提取码 xff1a dou3 灾前 灾后影像 下载地址2 xff1
  • nms_rotated编译出错fatal error: THC/THC.h: No such file or directory

    问题描述 xff1a 使用 python setup py develop or 34 pip install v e 34 编译nms rotated时出错 xff1a fatal error THC THC h No such file
  • 解决 AttributeError: module ‘numpy‘ has no attribute ‘int‘

    原因 xff1a numpy int在NumPy 1 20中已弃用 xff0c 在NumPy 1 24中已删除 解决方式 xff1a 将numpy int更改为numpy int xff0c int 方法 xff1a 点击出现错误代码链接会
  • 机载高分辨率SAR数据(~0.1米)

    美国桑迪亚 xff08 sandia xff09 国家实验室提供一系列机载SAR数据 xff0c 包括MiniSAR FARAR等 数据分辨率4英寸 xff0c 约0 1米 原始数据下载地址 xff0c 数据是复数据 xff0c 以不同格式
  • ubuntu18.04 及以上版本命令模式和GUI切换

    网上大多数说的CTRL 43 ALT 43 F1 6进入命令模式 xff0c CTRL 43 ALT 43 F7进入GUI模式 xff0c 在ubuntu18 04 及以上无效 正确的方式是 xff1a 进入命令模式可以通过CTRL 43
  • Python内置库——http.client源码刨析

    看过了http client的文档 xff0c 趁热打铁 xff0c 今天继续研究一下http client的源码 xff08 一 xff09 你会怎么实现 开始之前先让我们回忆一下一个HTTP调用的完整流程 xff1a 看到这张图 xff
  • ssh连接ubuntu访问拒绝(access denied)

    网上大多针对ssh连接ubuntu访问拒绝的解决办法是安装ssh或防火墙开启端口等等 xff0c 但这些都没问题之后还是访问拒绝 xff0c 则考虑ssh包可能安装的有问题 xff0c 可以尝试重装 流程如下 xff1a 1 在ubuntu
  • 【论文-目标检测】RTMDet: An Empirical Study of Designing Real-Time Object Detectors

    论文 代码 官方原理与实现详解 发展YOLO系列并方便支持实例分割和斜框检测等任务 xff0c 亮点 xff1a 设计兼容性backbone和neck xff0c 采用大核深度可分离卷积 xff1b 动态标签分配中采用软标签计算匹配损失 x
  • 【OpenCV】图像金字塔 -- 下采样cv2.pyrDown() , 上采样cv2.pyrUp()

    参考 xff1a cv2 pyrDown TheAILearner 1 cv2 pyrDown 函数cv2 pyrDown 用于实现高斯金字塔中的下采样 函数原型 xff1a dst img 61 cv2 pyrDown src img d
  • 理解depth-wise 卷积

    EfficientNet利用depth wise卷积来减少FLOPs但是计算速度却并没有相应的变快 反而拥有更多FLOPs的RegNet号称推理速度是EfficientNet的5倍 非常好奇 xff0c 这里面发生了什么 xff0c 为什么
  • GIoU (Generalized Intersection over Union) 详解

    论文 xff1a Generalized Intersection over Union A Metric and A Loss for Bounding Box Regression 官方解读 xff1a Generalized Inte
  • Gitee push错误 Access denied: You do not have permission to push to the protected branch ‘master‘ via

    错误 xff1a 首次使用gitee向别人的repo提交代码 xff0c 发现出现权限问题无法push到master xff0c 提交命令如下 xff1a git push u origin master master 错误信息如下 xff
  • GDAL重采样与裁剪图像示例

    GDAL重采样 xff0c 可以通过写文件时改变图像尺寸和geo transformes的分辨率信息实现 核心代码示例如下 xff1a in ds 61 gdal Open fi gdal GA ReadOnly geotrans 61 i
  • pycharm专业版连接远程docker容器

    一 配置远程docker容器 1 启动带有端口的docker容器 6006端口是用来运行tensorboard的 xff0c 这里重要的是22端口 如果希望通过ssh远程连接docker xff0c 需要对容器的22端口做端口映射 dock
  • VScode 远程开发配置

    一 配置免密远程登录 因为是要远程登录 xff0c 那么需要通过使用ssh进行密钥对登录 xff0c 这样每次登录服务器就可以不用输入密码了 先来一句官方介绍 xff1a ssh 公钥认证是一种方便 高安全性的身份验证方法 xff0c 它将
  • np.meshgrid()与torch.meshgrid()的区别

    比如要生成一张图像 h 61 6 w 61 10 的xy坐标点 xff0c 看下两者的实现方式 xff1a 两种方式的差异在于 xff1a xs ys 61 np meshgrid np arange w np arange h xs ys
  • JSON是什么

    提起 JSON xff0c 作为如今最受欢迎的数据交换格式 xff0c 可以说是无人不知 无人不晓了 JSON 全称 JavaScript Object Notation xff08 JS 对象简谱 xff09 xff0c 自诞生之初的小目