文章目录
一、人类的信息传播革命
人类历史上曾经历了五次传播革命:语言、文字、印刷、电子、网络。
每一次信息传播革命都把人类文明推向一个新的发展阶段。
第一次信息传播革命是语言传播的诞生:提高了人类信息传播的质量、速度与效率。
人学会了说话,使得人得以脱离动物界,使人得以成为人。恩格斯说劳动创造了人。是不对的。蚂蚁也劳动。劳动不是人和动物相区别的标志。只有语言才是和动物相区别的标志。
也许有人会说,动物不是也能发声,有自己的语言吗?那么我们来看,动物的发声和人的语言区别在哪里,虽然动物也能发声,其声音也有意义。
但动物发声和人最大不同在于:动物的声音都是即时的“情景反应”。而人可以用语言来表示眼前并不存在的事物。人可以预约性爱,“明晚这棵大树下见。”动物能预约性爱吗?语言使得人有了明天,正因为有了明天,人也就有了时间的意识,有了过去、现在和未来的分别,人从此有了历史感。
同时,人类的发明语言后,不可避免的一个问题是,当人类的族群种类繁多,生活环境各不相同时,会产生不同的语言。
如何克服语言障碍,进行有效的沟通,是个很重要的问题。一般而言,统治者会制定一套“官话”,作为全国的通用语言。如孔子教授三千弟子时所用“雅言”,西汉时期的“通语”,明清时期的“官话”,以及现代的“普通话”。都属于人类的通用语言。通用语言的出现加快了人类之间的文化传播,使得信息交流更加方便快捷,快速的推动了整个人类的进化进程。
第二次信息传播革命是文字传播的诞生:使得人类的信息传播革命第一次突破时间、空间的限制,得以广泛流传和长期保存。
当语言变成了文字,文字传播的久远性质,大大改变了以说话为传播手段的生活方式和精神态度。文字可以久远保存的特点,给人带来了永不磨灭的印象,文字的永久性使得人类的历史感达到了前所未有的庄严和庄重。渐渐地,“口说无凭”了,从“耳证”进入了“字证”。人的威望、信誉、价值主要依靠文字系统来确立了。
第三次信息传播革命是印刷传播的诞生。报纸、杂志、书籍等印刷品大众媒介迅速普及。
每一次文化传播方式的更新,由于其成本大为降低,其结果就必然是文化大普及,使得更多的人掌握了文化知识,从而原先的社会结构非得打破重建不可。因此每一次传播手段的革命都会造成天下大乱,然后按照新传播手段的力量和影响力来重塑社会。
雕版印刷带来的后果就是在五代十国的大乱中,中国贵族阶层被彻底消灭了。中国从此之后进入了平民、士大夫和皇朝互动的时代。雕版印刷带来来宋代灿烂的文化,之后一直到清朝末期,雕版印刷的传播方式一直没有改变,中国社会的基本形态也就没有变化。
现代报纸的出现大大加快了信息传播的速度和广度。报纸不仅大大改变了文化人的心态,也改变了广大平民获取信息的方式。报纸使平民能以低廉的成本获取知识和受教育。可以说,是报纸的出现,才真正开始把中国推向现代化的改革之路。
第四次信息传播革命是模拟式电子传播的诞生。
19世纪40年代至70年代,一系列模拟式电子传播技术与媒介相继出现,并迅速普及,如:电话,收音机等,使得人类信息传播的速度空前迅疾,范围空前广泛,内容空前丰富,复制扩散和保存信息的能力空前增强。人类进入以模拟式电子传播为代表的大众传播时代。
二、信息传播之互联网
随着人类社会的进步和发展,最新的一次信息传播革命,即正在我们身边发生的第五次信息传播革命,是互联网传播的诞生。
90年代以来,先进的计算机技术不仅征服了文字数字化的难题,而且征服了比文字更复杂的声音世界。如今,表现和记录人类物资和精神世界的数字、语言、文字、声音、图画和影像等过去相互之间界限分明的各种信息传播方式,都可以用计算机的二进制语言来作数字化处理,从而可以浑然一体,相互转换了。报纸、广播、电视和书籍、杂志、电影等传统大众传播媒介在形式之间的差异正在缩小或消失;交互式传播媒体的出现,使得传播者与受众之间的传统的相互关系正面临巨大的变化。人类进入了真正的信息时代。
互联网信息的传播最直观的是发生在1989年,英国著名计算机科学家蒂姆发明了万维网,就是我们所知的www或web,能让人们通过浏览器访问服务器上的页面。并于1991年,被公众所知。1994年,万维网联盟成立,就是我们所称的W3C,创建者也是蒂姆。
新的传播方式出现,带来了新的改变,连接更多的人类,更大的世界,但同时也会因族群,地域的不同,产生更大的信息差异化,此时,一种以互联网为基础的通用语言的出现,显得迫在眉睫。
其实早在1986年,国际标准化组织发布了一个信息管理方面的国际标准,就是SGML(Standard Generalized Markup Language 标准通用置标语言),用来定义电子文档结构和其描述内容。SGML早在万维网发明之前就已存在,是所有电子文档标记语言的起源。
SGML虽然功能强大,但是复杂臃肿,价格昂贵,不适用于web数据描述,因此,1995年,W3C发布了HTML (Hyper Text Markup Language 超文本标记语言)2.0标准(HTML 1.0是草案),专门适用于web的网页开发,但只有固定的标签集。
接下来我们将历史的进度拉快:
1998年,W3C发布XML(Extensible Markup Language 可扩展标记语言) 1.0标准,用来简化Web文档信息的传输,可自定义标签,也是各种应用程序进行数据传输最常用的工具。
2000年,W3C发布XHTML 1.0标准,它是基于XML的应用,旨在解决HTML语法松散的问题,本质上是一个过渡技术,目的是实现HTML向XML的过渡。
2014年,W3C宣布HTML 5标准规范制定完成,方便了移动端的软件开发,HTML5已经不是SGML的子集,是一个全新的标准。
SGML和XML都是元语言,XML是SGML的一个子集;HTML是基于SGML的一个应用实例,XHTML是基于XML的一个应用实例;
三、伟大的通用语言XML
严格上来说XML仅仅算是一种通用数据格式,而不能算是一种语言,被设计为“什么都不做”,所以XML数据或XML文档只用于组织、存储数据,除此之外的数据生成、读取、传送、存取等等操作都与XML本身无关,必须依靠专用的解析器来解析XML数据。它是一种可扩展的标记语言,它的格式与超文本标记语言HTML的格式类似,它拥有众多优势:
- 良好的可读性
- 方便的可扩展性
- 数据内容及其形式的分离
- 便于信息的检索
- 可以轻松的跨平台应用
XML在1996年被提出之后,一直被应用于各种程序的配置文件、程序间数据的传输、充当小型数据库等。
它的语法和HTML的语法也很相似,主要通过标签和属性及标签内包含的内容体现。具体不在赘述,看一个示例体现
<student name="John" age="10">
< address >
< country >中国</ country >
< city >上海</ city >
< district >宝山</ district >
...
</ address >
</student>
这种格式在当时可以很清晰的表示一个学生的姓名、性别、地址等信息。
以至于XML这种通用数据流行了近10年的时间,直到一种新的通用数据的诞生并全面被认可之后才渐渐淡出视野,但就算如此,时至今日依然有很多程序还在沿用XML的数据格式进行数据的传输和交互。
四、json的出现
话说人类作为这个世界“自认为的主宰者”,总是在想方设法的以最少的劳动量来完成更多的事情,总结成一个字,就是懒。偷懒绝对是全人类共同的追求。当某种规范的要求过于繁多时,总有人想尽办法的去偷懒(优化),XML1.0的版本规范内容有差不多50多页的pdf,此处仅仅是将W3C上XML规范的目录部分粘出来,大家体会一下
2001年4月,旧金山湾区某车库的一台计算机发出了一个信息,发送人是Crockford 和Morningstar ,他们是一家名为 State Software 的技术咨询公司的联合创始人,他们当时聚集在 Morningstar 的车库里测试某个想法,发出了此消息。
<html><head><script>
document.domain = 'fudco';
parent.session.receive(
{ to: "session", do: "test",
text: "Hello world" }
)
</script></head></html>
这是计算机历史上重要的时刻,然而当时这个消息并没有引起太大的重视。
因为它就是 JavaScript,实际上,使用 JavaScript 表示信息的想法也是如此的简单,发送人自己也说过他不是第一个这样做的人。他说 Netscape 公司的某人早在 1996 年就使用 JavaScript 数组字面量来交换信息。
而这么做的主要原因,因为消息本身就是 JavaScript,其不需要任何特殊解析工作,JavaScript 解释器就可搞定一切,不再需要专用解析器解析这种格式的数据。
但实际上这种信息与 JavaScript 解释器是发生了冲突的。JavaScript 保留了大量的关键字,Crockford 和 Morningstar 无意中在其数据中使用了一个保留字。他们使用了 do 作为了键名,但 do 是解释器中的保留字。因为 JavaScript 使用的保留字太多了,Crockford 做了决定:既然不可避免的要使用到这些保留字,那就给这种新的数据的键名都加上引号。被引起来的键名会被 JavaScript 解释器识别成字符串,其意味着那些保留字也可以放心安全的使用。这就为什么今天 JSON 键名都要用引号引起来的原因。
Crockford 和 Morningstar 意识到这技术可以应用于各类应用系统。想给其命名为 “JSML”,即JavaScript 标记语言(JavaScript Markup Language)的意思,但发现这个缩写已经被一个名为 Java Speech 标记语言的东西所使用了。因此他们决定采用 “JavaScript Object Notation”,缩写为 JSON。他们开始向客户推销,但很快发现客户不愿意冒险使用缺乏官方规范的未知技术。所以 Crockford 决定写一个规范。
2002 年,Crockford 买下了 JSON.org 域名,放上了 JSON 语法及一个解释器的实例例子。该网站仍然在运行,现在已经包含有 2013 年正式批准的 JSON ECMA 标准的显著链接。在该网站建立后,Crockford 并没有过多的推广,但很快发现很多人都在提交各种不同编程语言的 JSON 解析器实现。JSON 的血统显然与 JavaScript 相关联,但很明显 JSON 非常适合于不同语言之间的数据交换。
2005 年,JSON 有了一次大爆发。那一年,一位名叫 Jesse James Garrett 的网页设计师和开发者在博客文章中创造了 “AJAX” 一词。他很谨慎地强调:AJAX 并不是新技术,而是 “好几种蓬勃发展的技术以某种强大的新方式汇集在一起。” AJAX 是 Garrett 给这种正受到青睐的 Web 应用程序的新开发方法的命名。他的博客文章接着描述了开发人员如何利用 JavaScript 和 XMLHttpRequest 构建新型应用程序,这些应用程序比传统的网页更具响应性和状态性。他还以 Gmail 和 Flickr 网站已经使用 AJAX 技术作为了例子。
当然了,“AJAX” 中的 “X” 代表 XML。但在随后的问答帖子中,Garrett 指出,JSON 可以完全替代 XML。他写道:“虽然 XML 是 AJAX 客户端进行数据输入、输出的最完善的技术,但要实现同样的效果,也可以使用像 JavaScript Object Notation(JSON)或任何类似的结构数据方法等技术。 ”
开发者确实发现在构建 AJAX 应用程序时可以很容易的使用 JSON,许多人更喜欢它而不是 XML。具有讽刺意味的是,对 AJAX 的兴趣逐渐的导致了 JSON 的普及。大约在这个时候,JSON 引起了博客圈的注意。
2006 年,Dave Winer,一位高产的博主,他也是许多基于 XML 的技术背后的开发工程师,他抱怨到 JSON 毫无疑问的正在重新发明 XML。尽管人们认为数据交换格式之间的竞争不会导致某一技术的消亡。
我很理解 Winer 的挫败感。事实上并没有太多人喜欢 XML。甚至 Winer 也说过他不喜欢 XML。但 XML 已被设计成一个可供任何人使用,并且可以用于几乎能想象到的所有事情。归根到底,XML 实际上是一门元语言,允许你为特定应用程序自定义该领域特定的语言。如 Web 信息流技术 RSS 和 SOAP(简单对象访问协议)就是例子。Winer 认为由于通用交换格式所带来的好处,努力达成共识非常重要。XML 的灵活性应该能满足任何人的需求,然而 JSON 格式呢,其并没有比 XML 提供更多东西,除了它抛弃了使 XML 更灵活的那些繁琐的东西。
Crockford 阅读了 Winer 的这篇文章并留下了评论。为了回应 JSON 重新发明 XML 的指责,Crockford 写到:“重造轮子的好处是可以得到一个更好的轮子。”
此时距离XML的诞生已经过去了8年。8年的时间,足够使开发者们习惯,同时也会厌倦繁琐的XML,转而扑向更简洁更清晰的可以实现XML所有内容的数据格式JSON。
{
"name": "John",
"age" : 10,
"address" : {
"country" : "中国",
"city" : "上海",
"district" : "宝山",
...
}
}
五、json和xml的区别
此时我们再来看json的规范,从客观的技术细节上说,JSON 规范比 XML 规范简单得多。只要你尝试过实现 JSON 的 Parser,就会发现它是种极其「易于解析」的格式。从顶层看来,JSON 格式可以用编译原理中教科书级的状态机来表达:一份 JSON 就是一棵语法树,其根结点是一个 Value,而 Value 只有解析成如下这几种东西的可能性:
上面这几种类型最核心的区别,两句话就可以讲清楚:
- Object 和 Array 支持嵌套,可以递归包含 Value,可以不是叶子结点。
- Number / String / true / false / null 无法嵌套,都是叶子结点。
比如你看 Object 的状态机规范,表明它约定的就是两个括号之间,多个 String 和 Value 的键值对而已:
再比如你看 String 的状态机规范,这一看就是两个双引号间的变长字符嘛:
整个 JSON 规范,都可以这样「一图胜千言」地轻松表达出来。
因此,哪怕是工业级的 JSON Parser,靠递归下降这样基础的算法照标准硬写就足够了。像 Google 在 V8 引擎里就是这么实现了 JSON.parse 十多年,直到 2019 年才做了解决递归爆栈风险的重构优化——果然偷懒是全世界程序员的共同追求(记住这句话)。但一个高质量的 XML Parser 则涉及流式处理、多线程、错误容忍等维度,已经相当于 Blink 和 Webkit 等现代浏览器引擎中的一个核心模块,甚至很难从引擎中单独抽出来开源。
所以,JSON 的规则更简单,且JSON结构更容易映射至一般语言的数据结构。
而XML,反之。
六、json和js的关系
相信很多开发者只要一提到json总会想到js,因为JSON不仅名称是JavaScript Object Notation,其格式也确实与js中对象(object)的格式并无一二,并且json的起源和javascript也有着千丝万缕的关系。
但其实json和js可以划一个分界线,首先json是基于ECMAScript语法,但这并不意味着json必须在js中使用,或者必须要产生什么联系,json在js中的处理确实比其他语言占有更多优势。但只是因为语法相似,而使得js开发者能更快的上手json而已。
事实上json作为一种通用数据格式,几乎所有编程语言中都有对json数据的支持,如:
- js中,json与对象的解析:
JSON.parse()/JSON.stringify();
- php中,json与对象的解析:
json_encode()/json_decode();
- java中,json与对象的解析:
fromJson()/toJson();
- python中,json与对象的解析:
json.dumps()/json.loads();
- …
所以,在整理了json的格式规范后,我们可以总结出以下几点:
- json仅仅是一种纯字符数据,不属于编程语言
- json的语法与js中object的语法几乎一致(略有不同)
- json数据以键值对形式存在,并在js对象的基础上严格化,如:key必须放在双引号中,数据结尾不允许出现没有意义的分号
- json数据中的键值对可以使用编程语言中所谓的关键字,因为被双引号表示成了字符
- json的数据可以用花括号{}或中括号[]包裹,对应js中的object和array
- json中不允许出现不允许出现function,undefined,NaN,但是可以有null,js中对象的值中可以出现
七、总结
以上,我们可以得出一个结论,不论是人类的语言,信息的方式,计算机的语言,乃至各种规则系统之间,简单性永远都是更占优势,但简单永远都只是相对的,并且需要视场景不同,人类会自动选择出最适合的解决问题的方案,只是这个方案在冥冥中存在着某种对简单的普适需求。就像经典的「奥卡姆剃刀」,假如解决一个问题有多种理论体系,我们都会自然地选择最简单的那个。
于是,从各个角度看待问题之后,到底为什么XML会渐渐被JSON 取代,不同的程序员可以告诉我们不同的答案:
- 二逼程序员说:因为可以偷懒少写几行代码,懂不懂什么叫大道至简。
- 普通程序员说:因为这样工程更好维护,不同场景下应该实事求是。
- 文艺程序员说:因为自由追求更简单方便的规则体系,是人的普适本能。
今天的分享内容,对于日常实现需求而言可能确实意义不大。但寻找某些现象背后共通的本质,却有种奇妙的乐趣。
大家知道小时候的爱因斯坦在发现「罗盘总是指向南方」的时候,是怎么想的吗?
一定有什么东西在背后深深地隐藏着。
感谢。。。