0 前言
很多年前就接触过JSON,那是一份接口协议文档,两个模块程序之间用JSON通信。
但是,直到最近,才学习JSON,学会用手搓、用aardio编程处理JSON数据等。究其原因如下:
- 拖延症已病入膏肓。
- 现有JSON学习资料,几乎总与JavaScript、或者其他什么语言搅和在一起,让人望而生畏。
学会之后回头再看,JSON,其实只需要一篇小文章就能讲清楚。
1 JSON协议
JSON本身是一种协议,与TCP/IP、UDP等网络协议没有本质上的不同,与JavaScript等语言也没有必然联系。
协议是用来规范通信数据格式的,以便协议双方能够顺利交换数据(信息),实现通信。
2 JSON值
JSON定义了七种数据,称作JSON值:
1、数字(number)
数字只能是整数(如:0、2、5)或浮点数(如:7.99)。
2、字符串(string)
字符串以英文双引号“"”开始与结束(如:"json")。
3、数组(array)
数组以左中括号“[”开始,以右中括号“]”结束(如:[0, 2, 5, 7])。
4、对象(object)
对象以左花括号“{”开始,以右花括号“}”结束(如:{"name":"wenxi"})。
5、true
只能是true,不能写作True、TRUE等。
6、false
只能是false,不能写作False、FALSE等。
7、null
只能是null,不能写作NULL等。
实际应用中,一个JSON数据包,要么是一个JSON数组,要么是一个JSON对象。其他JSON值,即数字、字符串、true、false、null等,通常作为数组或对象的元素出现。
3 JSON对象
一个JSON对象以“{”开头,以“}”结束:
{ key:value,key1:value1… }
或中文表示:
{ 键:值,键1:值1… }
其中:
- 键(key)只能是JSON字符串(string)。
- 值(value)可以是任意类型JSON值,包括JSON对象——这意味着JSON对象可以嵌套,即:一个JSON对象包含其他JSON对象。还可以包含JSON数组。
- 键、值分隔符“:”是英文冒号,前后可以有空格或其他空白字符。
- 键值对分隔符“,”是英文逗号,前后可以有空格或其他空白字符。最后一个键值对之后不能有分隔符“,”。
4 JSON数组
一个JSON数组以“[”开头,以“]”结束:
[ value,value1,value2… ]
或中文表示:
[ 值,值1,值2…]
其中:
- 值可以是任意类型JSON值,包括JSON数组——这意味着JSON数组可以嵌套,即:一个JSON数组包含其他JSON数组。还可以包含JSON对象。
- 值分隔符“,”是英文逗号,前后可以有空格或其他空白字符。最后一个值之后不能有分隔符“,”。
5 JSON应用举例
5.1 表字段存储JSON数据(JSON数组)
一开始在wx_sleep表中,设计日期时间字段qy_time记录每晚起夜时间:
实际一使用就发现,有起夜2次的情况。查知偶尔一晚起夜3次算正常,于是新增日期时间字段qy1_time、qy2_time:
学习JSON之后,发现用JSON数组可将所有起夜时间存储到一个VARCHAR字段中(qy_notes)。再不用纠结qy_time字段个数了:
手搓两条起夜数据,指定JSON格式显示:
如果HeidiSQL显示为一行,说明按JSON格式化数据失败,即不是合法的JSON数组(末尾多了个“,”):
5.2 用JSON存放配置数据(JSON对象)
实际应用中,常用JSON保存程序配置信息。JSON配置信息,可以看作是人向程序传递信息的JSON数据包。
以下是Cryptomator程序的配置文件settings.json:
从上图可知,配置文件settings.json中只有一个JSON对象。这个对象中,与键"directories"对应的值,是一个JSON数组。这个数组包含了另一个JSON对象。
5.3 把JSON当数据库使用(JSON数组)
JSON对象与对象、数组与数组以及对象与数组之间相互包含(即嵌套),不限层级,使得JSON极具生命力,应用十分广泛。
比如,Markdown写作软件“妙笔”拿JSON当数据库用:
由上图可知,数据文件doc_tree.json中只有一个JSON数组。这个数组包含多个对象。其第一个对象中,与键"children"对应的值,是一个JSON数组,这个数组包含了多个JSON对象。
6 总结
JSON是一种协议。JSON协议数据包结构本质上只有两种:JSON对象和JSON数组。所以,JSON非常容易学习:
- 熟悉JSON值定义(七种),尤其是JSON字符串、JSON对象、JSON数组;
- 熟悉JSON对象嵌套、JSON数组嵌套以及两者混合嵌套;
- 一个JSON协议数据包,要么是一个JSON对象,要么是一个JSON数组。
发表评论
评论列表(0)