web开发必备知识:一文掌握JSON数据格式

版权声明:转载请注明出处^_^ https://blog.csdn.net/zhou307/article/details/83476726

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;
}

猜你喜欢

转载自blog.csdn.net/zhou307/article/details/83476726
今日推荐