文章目录

  • 说明:所有代码亲测有效!
  • 概述
  • JSON是一种技术标准
  • 从简单示例开始(含测试)
  • 使用JSON的原因
  • JSON核心概念
    • JSON数据类型
      • 名称-值对
      • 对象
      • 数组
    • JSON的值类型
      • 字符串
      • 数值
      • 布尔值
      • null
    • JSON的版本
    • JSON的注释
    • JSON文件及MIME类型
    • JSON编码规范
      • JSON属性名
      • JSON日期属性的值
      • JSON经纬度值
      • JSON编码缩进
  • 工具和风格补充

说明:所有代码亲测有效!

概述

JavaScript对象表示法(JavaScript Object Notation,JSON)已经成为RESTful接口设计中的事实标准,JSON数据格式使得应用程序可以通过RESTful API等方式在网络上进行数据通信,架构师和开发人员可以使用一整套现成的技术生态系统(鲜为人知的标准、工具和相关技术)来搭建设计精巧的应用程序。JSON不局限于某项技术,本身非私有,且可移植。对于产生(序列化)和读取(反序列化)JSON数据,绝大多数主流的现代编程语言和平台都可以提供优秀的JSON支持,如JavaScript、Ruby、Java、Groovy、Go、Scala、Perl、PHP、Python、Clojure、C#等等。JSON不仅仅是Ajax调用中XML的一个简单的替代品,它也日益成为互联网数据交换领域的骨干元素。严谨的标准和技术最佳实践加上对JSON的热爱,有益于我们搭建一个真正优雅、有用而又高效的应用程序。事实上,现在能够用XML实现的功能都可以(也应当)用JSON实现。对于设计或实现Web移动端应用程序、RESTful API以及消息系统的架构师和开发人员,JSON都是有必要学习和研究的内容。JSON非常简单,由对象、数组、名称-值对这三种开发人员熟悉的结构体所组成。除了表现层状态转化(REpresentational State Transfer,REST),JSON在Node.js、MongoDB等NoSQL数据库、Kafka等消息平台等环境中也有应用。

JSON是一种技术标准

JSON是Douglas Crockford于2001年提出的,现已成为一项技术标准(例如HTTP就是一种技术标准)。
其他的没啥好说的,知道这些就行了。

从简单示例开始(含测试)

文件名:firstValidObject.json

{"thisis": "My first JSON document"
}

文件名firstValidArray.json

["also","a","valid","JSON","doc"
]

我们对firstValidArray.json用JSLint工具进行测试:

注意直接使用的Tab不被允许,需要使用空格。
测试工具说明:
JSLint工具:
http://www.jslint.com/
此外还有JSONLint工具,Github地址:
https://github.com/zaach/jsonlint
打开JSLint工具以后,如下图

Source处粘贴JSON文件内容,点击下方JSLint按钮,下方“Function Report“的下方就会出现测试结果。Clear按钮清除代码。成功或失败的样例在上面的图片中已有展示。

使用JSON的原因

Ecma国际和IETF所做标准化工作帮助JSON获得行业认可,下面因素促使JSON广泛流行:

  • 基于 JSON 和 RESTful API 的爆发式增长;
  • JSON 基本数据结构的简洁性;
  • JavaScript的日益流行。

依据 Douglas Crockford 的说法,JSON 是 JavaScript 对象字面量表示法的一个子集,因此可以无缝的与 JavaScript开发融为一体。

下面是至少几千个基于 JSON 的 RESTful API 的比较流行的代表:

  • LinkedIn
  • Twitter
  • Facebook
  • Salesforce
  • Github
  • DropBox
  • Tumblr
  • Amazon Web Services (AWS)

JSON 非常简洁,并且正在逐步替代XML成为互联网上主要的数据交换格式。它易于阅读,相关结构也很容易与软件开发人员所熟悉的概念对应起来,例如数组、对象和 key-value 对。我们不用再挠头苦思某个东西应当是 元素还是属性,也不用就这一点与人争论不休。与 XML 相比,对象及其数据成员这一组合更适合面向对象的设计和开发。由于节省了每个元素的开始标签与结束标签,JSON 格式的额外开销更少、更为紧凑,所以 JSON 格式的文档一般比 XML 文档小。从企业级应用角度来看,与XML相比,JSON文档在网络上传递与处理更快,因此效率更高。
虽然 Douglas Crockford 将其设计为一种数据交换格式(通常用于REST),但如今 JSON 在配置文件中也占有一席之地,如 Node.js 和 Sublime Text 等广泛应用的。Node.js 使用 package.json 文件来定义其标准的 npm 包结构;Sublime Text 作为Web开发社区一款流行 IDE,使用 JSON 来配置外观和包管理器。

JSON核心概念

JSON数据类型

JSON包含下面三种核心数据类型:

  • 名称-值对
    由一个名称(数据类型)和一个值组成
  • 对象
    名称-值对的无序集合
  • 数组
    值的有序集合

名称-值对

nameValue.json

{"name": "小明","ID": "123456","University": "Tsinghua University"
}

这类JSON数据类型应该具有以下特征:

  • 每一个键名(如"name")应该
    -位于冒号(:)左边;
    -是一个字符串,而且必须由双引号括起来。
  • 值(如"小明")位于冒号的右边。
    上例中值用的均为字符串类型,实际上还可以有多种其他类型。

对象

对象由名称-值对组成。
下面是一个表示地址的对象:
simpleJsonObject.json

{"address" : {"line1" : "555 Any Street","city" : "Denver","stateOrProvince" : "CO","zipOrPostalCode" : "80202","country" : "USA"}
}

下面是一个带有内嵌数组的对象:
jsonObjectNestedArray.json

{"speaker" : {"firstName" : "Larson","lastName" : "Richard","topics" : ["JSON", "REST", "SOA"]}
}

下面是一个内嵌其他对象的对象:
jsonObjectNestedObject.json

{"speaker" : {"firstName" : "Larson","lastName" : "Richard","topics" : ["JSON", "REST", "SOA"],"address" : {"line1" : "555 Any Street","city" : "Denver","stateOrProvince" : "CO","zipOrPostalCode" : "80202","country" : "USA"}}
}

对象具有以下特征:

  • 由左大括号{和右大括号}括起来;
  • 由一些无序的名称-值对构成,以逗号分隔;
  • 可以是空对象{};
  • 可以内嵌在其他对象或者数组中。

数组

下面是一个内嵌其他对象和数组的数组,该数组描述了包含多个发言人:

{"speakers": [{"firstName" : "Larson","lastName" : "Richard","topics" : ["JSON", "REST", "SOA"],"address" : {"line1" : "555 Any Street","city" : "Denver","stateOrProvince" : "CO","country" : "USA"}},{"firstName" : "Tom","lastName" : "Green","topics" : ["JSON", "REST", "SOA"],"address" : {"line1" : "Fifth Avenue","city" : "New York","stateOrProvince" : "New York","country" : "USA"}}]
}

数组具有以下特征:

  • 由左中括号[和右中括号]括起来;
  • 由一些有序的值构成,以逗号分隔;
  • 可以是空数组[];
  • 可以内嵌在其他数组或者对象中;
  • 具有以0或1开头的索引。

JSON的值类型

JSON的值类型用于表示出现在名称-值对冒号(:)右侧的数据类型。
这些类型包括:

  • 对象
  • 数组
  • 字符串
  • 数值
  • 布尔值
  • null

接下来介绍后四种类型

字符串

一些合法的JSON字符串
jsonString.json

["fred","fred\t","\b","","\t","\u004A"
]

字符串具有以下特征:

  • 由包含在双引号(" ")里面的零个或多个Unicode字符串组成。除此之外,还包括以下列举的一些字符;
  • 由单引号(’ ')引起来的字符串为非法字符串。

JSON字符串还可以包含由反斜杠转义的字符:
\''双引号
\\反斜杠
\/斜杠
\b退格
\f换页
\n换行
\r回车
\tTab制表符
\u后跟4位十六进制数字(表示一个Unicode字符)

数值

jsonNumbers.json

{"age" : 29,"cost" : 299.99,"temperature" : -10.5,"unitPrice" : 0.2,"speedOfLight1" : 1.23E11,"speedOfLight2" : 1.23e+11,"avogadro1" : 6.023e23,"avogadro2" : 6.023E+23,"oneHundredth" : 10e-3,"ontTenth" : 10E-2
}

数值遵循JavaScript的双精度浮点数类型,并具有以下特征:

  • 数值永远是十进制数(只能出现数字0~9),不能以0开头;
  • 数值可以存在由小数点(.)开头的小数部分;
  • 数值可以是以10为底的指数,该指数用e或者E来表示,其后跟正号表示正指数幂(也可以不加),跟负号表示负指数幂;
  • 数值不支持八进制数和十六进制数;
  • 与JavaScript不同,数值不能是NaN后者Infinity。

布尔值

jsonBoolean.json

{"isRegistered" : true,"emailValidated" : false
}

布尔值存在以下特征:

  • 只存在两种值:true或者false;
  • 冒号(:)右边的true或者false不能用引号括起来。

null

从技术上说,null并不是一种类型,而是JSON中的一个特数值

jsonNull.json

{"address" : {"line1" : "555 Any Street","line2" : null,"city" : "Denver","stateOrProvince" : "CO","zipOrPostalCode" : "80202","country" : "USA"}
}

null具有以下特征:

  • 不能由括号括起来;
  • 表示某个键或属性没有值;
  • 用作占位符。

JSON的版本

Douglas Crockford 认为JSON核心标准不会有新的版本。
JSON标准唯一化的目的是避免支持早期版本而在向后兼容的时候遇到陷阱(哪怕当前不是那么完美)。
Douglas Crockford认为,开发社区有新需要时,新的数据格式将直接替代JSON。
然而,“无版本”的理念仅适用于JSON核心数据格式,有些标准是JSON社区中其他人员提出的。

JSON的注释

我们在开发中被强调注释的意义,然而JSON中根本就没有注释。
JSON在开始允许注释到移除注释,有下面原因:

  • Crockford 认为注释没有用;
  • JSON解释器在支持注释方面存在困难;
  • 出现了滥用注释的情况。Crockford 发现有些注释被用于解析指令,这会彻底摧毁JSON的互操作性;
  • 移除注释有利于JSON实现跨平台的可移植性,简化了支持这方面的工作。

JSON文件及MIME类型

.json是文件系统中存储JSON数据的标准类型。
JSON的媒体类型(MIME)为application/json,这可以在IANA的媒体类型网站上找到。
通过在HTTP头部中声明JSON媒体类型,RESTful Web Service 的开发者和使用者一般使用这种名为内容协商的机制来表明自己正在使用JSON进行数据交换。

JSON编码规范

Google发布过JSON编码规范,比较详细,对API设计者和开发者最重要的是:

  • 属性名
  • 日期属性的值
  • 枚举值

JSON属性名

属性名位于key-value对中间冒号的左侧(属性值位于右侧)。
JSON属性命名风格主要是有以下两种:

  • 小驼峰式命名法(lowerCamelCase)
    除第一个词均为小写字母外,其余每个词均以大写字母开头
  • 以下划线分隔的短语(snake_case)
    所有字母均小写,词与词之间用下划线(_)分隔

jsonPropertyName.json

{"firstName" : "John Smith"
}

JSON日期属性的值

Google的编码规范要求日期遵循RFC 3339的格式

jsonDateFormat.json

{"dateRegistered" : "2019-10-04T15:00:11-05:00"
}

JSON经纬度值

Google建议遵循ISO 6709标准

jsonLatLon.json

{"empireStateBilding" : "40.748747-73.985547"
}

JSON编码缩进

大致规则(Google未提及):

  • JSON是序列化格式,不是呈现格式,缩进规则意义不大。
  • 很多JSON格式化工具会让使用者自选具体缩进方案(两格、三格、四格等)
  • 两格缩进比较常用

工具和风格补充

  • 架构风格可选noBackend(无后端),可以与后端解耦
  • JSON Editor Online 工具可以对JSON数据进行建模
  • JSON Generator 可以生成示例数据(快速生成大量测试数据)

【JSON】JSON入门详解(一)相关推荐

  1. 【JSON】JSON入门详解(二)

    文章目录 JSON基础文章荐读 JavaScript创建JSON对象 JSON与XML的那些事 JSON与XML的相同之处 JSON与XML的不同之处 AJAX相关JSON与XML JSON与XML的 ...

  2. java web json_java web中对json的使用详解

    一.在Java Web的开发过程中,如果希望调用Java对象转化成JSON对象等操作.则需要引入以下jar包,不然运行时则报错. 1.commons-beanutils.jar 2.commons-c ...

  3. python request.post 字典参数以json_Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  4. java json path_Java使用JSONPath解析JSON完整内容详解

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...

  5. python3 json模块_详解python 3.6 安装json 模块(simplejson)

    JSON 相关概念: 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反 ...

  6. MySQL操作之JSON数据类型操作详解

    MySQL操作之JSON数据类型操作详解 这篇文章主要介绍了MySQL操作之JSON数据类型操作详解,内容较为详细,具有收藏价值,需要的朋友可以参考. 概述 mysql自5.7.8版本开始,就支持了j ...

  7. python post json参数,Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  8. daemon.json配置参数详解

    ** daemon.json配置参数详解 ** 背景 docker安装的时候没有daemon.json这个文件 一般情况下,daemon.json中配置的项目参数,在启动参数中同样适用.(有些可能会冲 ...

  9. docker-daemon.json各配置详解

    docker-daemon.json各配置详解{"api-cors-header":"", ------在引擎API中设置CORS标头"authori ...

  10. PHP:JSON函数json_encode详解

    PHP:JSON函数json_encode详解 [前言] json是一种轻量级的数据交换格式,在现在的web开发当中,简介和清晰的层次结构使得json成为理想的数据交换语言. 在php当中,就经常需要 ...

最新文章

  1. 中心频率为150kHz的选频放大检波电路补充测试
  2. 解决mysql获取不到连接的问题
  3. 算法与数据结构(稀疏数组)
  4. Graphic Device
  5. 打印工资条怎么做到每个人都有表头明细_抖音百万点赞!2018年最火的5个Excel骚操作,你都会吗?...
  6. [hdu1532]最大流
  7. Linux学习笔记(10)
  8. EncryptPad—Linux中好用的加密文本编辑器
  9. 训练集和测试集的产生方法
  10. 应用标题及描述不可滥用关键字
  11. Android触摸屏校对,android实现触摸屏校准
  12. 回不去的童年,归不了的故乡
  13. 各种三角函数的导数(正六边形记忆法)
  14. 微信公众平台接口程序搜索音乐
  15. 【数据可视化】python/pyecharts 画地图(热力图)(世界地图,省市地图,区县地图)、动态流向图
  16. ERD Online 4.0.3数据库在线建模(免费、更美、更稳定)
  17. 简单算法 - 链表逆序思路详解
  18. linux vps 桌面,linode linux vps的centos系统上安装X Window System GNOME图形桌面使用vnc连接 - 乖兔博客...
  19. 三、Kubernetes集群的命令行工具kubectl
  20. 笔记本电脑快速连接手机热点的方法

热门文章

  1. 美国计算机专业大学排名前30,美国计算机专业研究生大学排名TOP30
  2. 用java实现楼层导航_楼层导航
  3. VBA变量和函数名中文拼音输入提示
  4. VsCode模仿简单百度网页(html)
  5. 搜索引擎基本工作原理
  6. 基于CAA的CATIA二次开发环境搭建全过程(亲测可用)
  7. 小米八android耗电比例很大,MIUI系统最全省电方法,五招解决小米手机耗电快
  8. 大数据的本质和核心是什么
  9. 百度地图API去掉百度logo信息等
  10. jfinal,jxl导出excel遇到的异常