大家好,欢迎来到停止重构的频道
本期我们讨论Json。
Json是一种优秀的文本数据格式,在我们介绍的很多技术设计中,都会偏向使用Json作为数据格式。
我们将从以下几点展开讨论:
1、Json介绍
2、Json规范详解
3、Json的应用场景
首先介绍Json,Json是一种文本数据格式,来源于编程语言JavaScript的对象语法。
但实质上,Json是独立于JavaScript的,两者并无强关联。
简单地说,Json就是一种文本规范,或者说是一种字符串规范,图中所示的都是符合Json规范的文本。
那Json这种文本规范有什么好处呢?
Json的优点是可以简单灵活地表示树形结构的数据,通过简单的一条字符串,就可以记录多层结构的数据。
当然,可以记录树形数据的文本规范不仅只有Json,XML这种文本数据格式也可以。
且大部分情况下,XML和Json是可以相互转换的。
在文本不大、结构不复杂的情况下,Json更简洁,更易读一些。
但是,当文本特别大、或结构特别复杂时,XML在流式处理、易读性上更胜一筹。比如HTML、SVG实质上是建立在XML之上的。
另外,需要特别说清楚的是,Json文本实质上是一条字符串。
所以在程序中使用Json数据时,需要通过特定的方法转换为对应的对象变量才能使用。
以JavaScript为例,需要将Json字符串转换为JavaScript的对象变量后才能使用,JavaScript的对象变量也同样可转换为Json字符串。
所以,Json只是一种文本规范,至于程序中的Json对象、Json变量,则根据不同编程语言、不同Json库会有操作、表达上的差异。
且并不是所有编程语言都原生支持Json对象,一些编程语言需要引入第三方Json库才能使用。
接下来是Json规范详细介绍,Json支持6种类型的值。
分别是字符串、数字、布尔值、null、对象、数组。
先说明4种常规的值类型。
字符串是包含在双引号内的多个字符。
如果字符串内包含双引号,则需要使用\转义。
数字可以是整数、浮点数(小数)。
布尔值是true、false。
null为空值。
这4种常规类型的值是不允许内嵌其他值的,所以Json文本可以仅含有一个字符串或一个数字。
然后是2种允许内嵌其他值的值类型
对象是键/值对的字典,或者可以理解为哈希表。
需要包含在一对{}之内,单个对象内的多个键值对用逗号隔开。
键值对的键必须为字符串,而值则可以是Json支持的6种值的任意一种,且单个对象内的多个值无需统一类型。
数组是需要包含在一对[]之内的,单个数组内的多个值用逗号隔开。
数组内的值可以是Json支持的6种值的任意一种,且单个数组内的多个值无需统一类型。
得益于对象、数组这两种允许内嵌的值类型,Json文本能表示复杂的树形数据。
且为了提升Json文本的扩展性,一般都会采用对象或数组作为最外层结构。
所以我们看到的绝大多数Json文本都是包含在一对[]或{}中的。
数组或对象的长度、内嵌层深度在Json标准中并没有限制,但是一些Json库是可能存在长度限制的。
另外,Json文本中多余的空格、换行不会有实质上的影响,仅仅是为了方便阅读。
接下来是Json的应用场景,如前文所述。
Json这种文本规范一般适合数据量不大,且需要记录树形结构的数据,或需要灵活扩展数据时使用。
我们习惯在后端接口参数/返回数据、云计算任务、配置文件等场景使用Json文本。
在程序中使用Json对象作为数据池,在我们的低代码内核中使用Json文本记录程序逻辑等等。
很多场景我们都会优先考虑Json,简单、灵活的同时,也很易读。
一些文档型数据库,如ElasticSearch,数据也是Json形式的。
当然,Json很多时候只是一种选择,并不一定是当前场景的最优解。
而且很多人反而会因为Json灵活性很大,Json变量无需显式定义就可以随意增加数据,认为当项目比较大、开发人员比较多时,会让代码更加混乱、更难维护。
这个无法争辩,但我们想说的是。
其实任何技术工具都不会直接对项目质量造成影响的,工具只会影响生产效率。
对项目质量造成影响的是项目过程,而约束项目过程的是大多数人看不上眼的规范
在我们前面讨论前端、后端架构时都详细讨论过了。
规范不完备或团队无法遵守规范,那么无论使用什么工具,代码都将是混乱难维护的。
最后,Json虽然不是框架、工具。而仅仅是一种设计,但是却能简单直接、灵活地表示复杂的树形结构数据。
尽管很多编程语言也有类似的对象变量,Json只是它们的简化版。
但是仍然惊叹于这样的设计。
表达方式的改变,可能会引起某种质变。
如一种优秀的低代码表达方式,将会给编程效率带来质变。
这也是我们近些年一直在探索的事情。