JSON是什么
格式,语法,规范
讲完了,这就是JSON
,它就是这三个接近的定义,我更愿意叫它为格式。
大家只要结合自己生活中的经历来体验一下这三个词的含义,就OK了。下面讲一下格式是什么,主要是趁这个机会引出格式和协议的区别。
理解格式
如果大家用CSDN的markdown
语法来写博客的话,会发现最近多了一个生成目录的功能:@[TOC](目录)
,你在编辑器中这样子写上,编辑器就会自动为你生成目录,就如本文的目录一样。于此同时,你可能会发现,现在编辑器写各标题的时候,标题生成符号#
后面必须跟一个 空格
,这样子才能生成标题,以前是不需要的。这是为什么呢?
因为生成文章目录的过程就是对你文章内容解析的一个过程,扫描文章中带有 #空格
的字符串,把他们提取出来生成目录。但是如果不需要 空格
也能生成标题的话,那么只要你文中内容出现了#实际内容
,这种干扰的字符串,所生成的目录就会乱掉。
所以,我们称 markdown
是一种语法,而基于这种语法设计的编辑器就可以称为是 markdown
编辑器。
所以我在上面给出了三个相近的定义:格式,语法,规范。不了解 markdown
语法规则同学强烈建议学习。
格式和协议
那么格式就是协议吗?我们可以称 markdown
或者 json
为协议吗?
这就是希望大家思考的,以前提出需要看TCP/IP协议,我们对什么是协议理解了吗?以前说协议≈语言,而语言包含了语法。协议中包含了格式,比如 TCP
协议,他的格式是 TCP帧
,但是 TCP协议
可不是只是定义了一个 TCP帧格式
。TCP
建立连接时的三次握手
,断开连接时的四次挥手
,等等一系列交互过程,都是属于协议的范畴。这里引用网络上的定义作为结束:
网络协议核心三要素:语义,语法,时许
JSON格式解析
键值对
最基本的是键值对,键值对表示为 键 冒号 值
, 即 键 :值
,冒号左侧为键的名字,右侧为该键对应的值。比如:
"name":"tom",
"age":24,
"isTrue":true
其中,键name的值就是 “tom”。字符串都是需要用双引号括住的,因为冒号左侧是键名,键名一定是字符串,所以键名一律加引号。而冒号右侧视情况而定:如果是字符串,就用冒号,其他不需要。
现在,我们知道了冒号左侧是键名,那么冒号右侧到底支持些什么类型呢?
下面是右侧支持的基本类型:
- 字符串
- 整数
- 小数
- 布尔类型
以及两个复合类型: - JSON对象
- JSON数组
JSON对象
最基本的单元是键值对,键值对再往上就是JSON对象了。现在先不要纠结 这里的对象
是什么意思,我们先看看这个所谓的 JSON对象
长什么样?
{
"name":"tom",
"age":24
}
看见了吗?JSON对象就是用大括号括起来的键值对,也可以简单认为 用{}大括号括起来的就是JSON对象,所以以后,我们看到大括号,就要知道这是一个对象。
为什么叫对象
我们为什么称他为对象呢?
因为JSON大部分应用场景是被编程语言解析的,而且大都是面向对象的语言。由于键值对的存在,键名就对应每个对象自身的属性,而冒号右侧的值就对应每个属性的值。
这些编程语言在解析的时候,就会按照键值对规则把他们映射到一个对象中。
所以:
JSON键值对
中可以包含JSON对象
,反过来包含键值对的一定是JSON对象
JSON数组
数组内容可以直接包含 JSON对象
,四种基本类型
,所以格式举例如下:
格式1:数组中包含基本类型
{
"people":[
"tom","lucy","lily"
]
}
格式2:数组中包含JSON对象
{
"people":[
{
"name":"tom",
"age":24
},
{
"name":"lucy",
"age":18
}
]
}
其中,people
就是JSON数组
。可以认为,用[ ]中括号括起来的就是JSON数组。
总结
JSON格式主要是要被映射成编程语言中的对象,所以他一定是以 JSON对象
为起始,然后去结构化起始对象内的属性。而对象内的属性就是键值对,键值对中 值
的内容可以是四种基本类型和两种复合类型六种中的任意一种:如果是JSON对象,那么可以再构造键值对;如果是JSON数组,那么数组中可以包含基本类型和键值对,如果包含键值对,那么值的内容又可以是六种类型。如此反复,可以构造出非常复杂的信息量很大的内容。
进一步练习
我们来构造一个复杂的JSON格式供参考
比如,家庭中有房间,比如客厅和阳台,房间有名字和作用,客厅独有的是杯子,阳台独有的是花,他们都有各自的属性。我们构造的JSON对象如下
{
"houseName":"公寓303",
"address":"杭州",
"rooms":[
{
"name":"客厅",
"function":"接待客人",
"cups":[
{
"color":"red",
"capacity":2.3,
"number":8
},
{
"color":"green",
"capacity":1.2,
"number":7
}
]
},
{
"name":"阳台",
"function":"观赏",
"flowers":[
{
"color":"blue",
"number":3
},
{
"color":"yellow",
"number":6
}
]
}
]
}
上文中说到,JSON是被编程语言映射成对象的,那么向上面的例子,我们采用JAVA
来开发的话,可以映射如下:注意键值对就映射成对象的属性,大括号就映射成对象,中括号就映射成数组,所以可够造成如下的类型
public class House {
String houseName;
String address;
List<Room> rooms;
}
public class Room {
String name;
String function;
List<Cup> cups;
List<Flower> flowers;
}
public class Cup {
String color;
double capacity;
int number;
}
public class Flower {
String color;
int number;
}