什么是json?

W3C JSON定义修改版:

  • JSON 指的是 JavaScript 对象表示法JavaScript Object Notation)
  • JSON 是轻量级文本数据交换格式,并不是编程语言
  • JSON 独立于语言存在
  • JSON 具有自我描述性,更易理解

读书,有必要对概念有较为清晰的认识。以下就涉及到的名词解释一下。

1)JavaScript对象表示法。JSON语法无非是对JavaScript对象的表述,甭管是用对象数组、单纯的对象还是组成对象的简单值,这些都只是为了描述对象或者多个对象服务的。如果不理解,那么请看以下例子。

10000   // 简单值,传递的数据几乎看不懂,到底代表什么意思?10000人?10000元?

["Sally", 25, 10000]   // 数组,传递的数据可能无法解读,Sally也许是一个品牌,25或许是品牌创立时间长度

{"name": "Sally", "age": 25, "salary": 10000}  // 一个对象,能够读懂数据意义

[{"name": "Sally", "age": 25, "salary": 10000},
{"name": "Jimmy", "age": 30, "salary": 20000}] // 对象数组(多个对象),能够读懂数据意义

Array和Object在JavaScript中都是复杂数据类型,但是如果需要产生意义的数据,以键对值(name/value)形式才是最佳途径。虽然数组等单独存在的形式虽然仍然可以作为数据传输,但是显然没有对象形式来的一目了然。

当然,我个人感觉通过名字来取值比使用数组索引取值要来的直观、方便、可靠。而且,这种方式和XML也很相似。

2)JSON属于轻量级的数据交换协议。一般而言,轻量级(lightweight)等价于耦合度低、侵入性小。不过在这里既可以指JSON与编程语言的耦合度小,又可以说明JSON文档储存相同信息所占的资源少的。再者,JSON和XML一样,既可以作为配置文件、也可以作为数据传输协议存在,当然,在JS中使用JSON比XML更优。

3)JSON语法上属于ECMAScript定义的子集,但是并不代表JSON从属于JavaScript。必须要明确一点,JSON是种数据传输的格式,不是一门编程语言,也不是只有JavaScript才使用JSON,比如近些年比较热门的Python、Java也能够使用JSON,即只要有相应的库(满足JSON协议)即可使用JSON。

本节最后用ECMAScript-404规范中的一段话概括上面的内容。

JSON是一种轻量级、基于文本、独立于语言的数据交换格式。JSON源于ECMAScript编程语言,但是相对编程语言独立。JSON为可移植的结构化数据表示定义了一个结构化规则集。


JSON的诞生

在JSON协议诞生之前,XML作为在互联网上传输数据的事实标准存在已经很多年。但是,业界也有对XML的抱怨,比如XML文档虽然易读写,但是相对来讲比较繁锁、冗长,虽然能够几乎横跨所有编程语言而且传输数据量大,但是执行效率过低等等。

大概在2001年左右,JSON便开始了小规模应用。直到2006年,一个叫Douglas Crockford的人,将JSON作为RFC文档提交到IETF,之后JSON正式成为了计算机网络通讯的标准协议之一。

可能没有学习过计算机网络的人会感到疑惑,开始不是说数据格式吗?怎么这里又变成协议了?两者到底是什么关系?

用比较有深度的话来说,协议就是涵盖了语义、语法、同步三大问题。而格式可能只能包含语义、语法。 也就是说在概念上,协议>=格式。

json语法

JSON语法支持的数据结构:

1)简单值

json支持javascript的简单数据类型String(字符串)、Number(数值)、Boolean(布尔值),以及特殊数据类型null。但是不支持ECMAScript中的undefined

注意:JSON字符串必须使用双引号(单引号会导致语法错误,与JS有区别),key必须使用双引号。如下的前四种形式都是错误的。

{'name': "Sally"}   // 错
{name: "Sally"} // 错
{"name": 'Sally'} // 错
{"name": Sally} // 错
{"name": "Sally"} // 对
{"age": 25} // 对

2)对象

JavaScript中对象字面量,可以给属性加单引号对('')、双引号对(""),甚至可以不加引号。如下图所示,不加双引号和加双引号均可。

但是,我们在开发JavaScript程序时,往往会补上双引号对("")。

var object = {
"name": "Nicholas",
"age": 29
};

与JavaScript中使用JSON形式创建对象不同,真正的JSON协议是没有变量声明以及变量名的(JSON作为数据传输协议,没有变量概念)。其次,JSON也没有语句末尾的分号";"(JSON不是JS语句,不需要分号)

3)数组

读到这里,可能你还会存在如下问题:

为什么JSON不支持ECMAScript语法中的特殊值undefined关键词?

为什么JSON对象属性必须使用双引号?

为什么JSON语句行末尾不需要加分号?

为什么JSON中没有变量的概念?

以上问题的解答就是基于一点,那就是JSON是一种用于各种编程语言之间数据交换的格式标准。

并不是每一种编程语言都支持undefined(比如Java、python等都没有undefined关键词),但是其余的数据类型在别的编程语言中都能得到原生支持;

对象属性必须加引号可以避免在属性值中出现空格导致信息出错问题,还方便接收方判断属性范围;

分号、变量对JSON来说毫无意义,因为JSON得目的是传输不可变的数据,只要拥有足够多对数据区分的符号足以。

解析与序列化

ECMAScript 5对解析JSON的行为进行规范,定义了全局对象JSON,即浏览器原生JSON对象。

JSON对象定义了两个方法:

  • stringify()   ,JS对象序列化为JSON字符串
  • parse()       ,JSON字符串解析为JS对象

为什么JavaScript不推荐使用其原生函数eval()解析json?

eval函数功能强大,常用于求值。但是,eval函数并不会对求值内容做检查,尤其是对字符串。因此,使用eval得到的并不是JSON,可能是一段恶意程序。

json和xml比较

Douglas Crockford认为,与xml相比,JSON在JavaScript中读写结构化数据的更优选择。因为在JavaScript中可以直接用原生的eval()函数解析JSON数据,而不必再创建DOM对象。

参考文献

1、《Professional JavaScript for Web Developers 3rd Edtion》  Nicholas C.Zakas

2、W3School JSON

3、JSON与XML的区别比较

4、Standard ECMA-404文档

一篇文章读懂JSON的更多相关文章

  1. 一篇文章读懂Java类加载器

    Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上 ...

  2. 大数据笔记(三十)——一篇文章读懂SparkSQL

    Spark SQL:类似Hive ======================================================= 一.Spark SQL基础 1.什么是Spark SQ ...

  3. 一篇文章读懂HTTPS及其背后的加密原理

    HTTPS(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.本文,就来深入介绍下其原理. 1 ...

  4. 【转】一篇文章读懂人力资源三支柱体系(COE・BP・SSC)

    通过人力资源转型,提升效率和效能   作者:Sharon Li,翰威特大中华区咨询总监. 杰克韦尔奇曾说过“人力资源负责人在任何企业中都应该是第二号人物”,但在中国,99%的企业都做不到.原因很简单, ...

  5. 一篇文章读懂开源web引擎Crosswalk-《转载》

    前言 Web技术的优势早已被广大应用开发者熟知,比如可与云服务轻松集成,基于响应式UI设计的精美布局,高度的开放性,跨平台能力, 高效的分发与部署等等.伴随着移动互联网的快速发展与HTML5技术的逐步 ...

  6. 《一篇文章读懂HTTPS及其背后的加密原理》阅读笔记

    HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.这篇文章深入介绍了它的原理. 当我们适用 ...

  7. Java枚举类与注解详解——一篇文章读懂枚举类与注解详

    目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...

  8. 一篇文章看懂JS闭包,都要2020年了,你怎么能还不懂闭包?

     壹 ❀ 引 我觉得每一位JavaScript工作者都无法避免与闭包打交道,就算在实际开发中不使用但面试中被问及也是常态了.就我而言对于闭包的理解仅止步于一些概念,看到相关代码我知道这是个闭包,但闭包 ...

  9. 一篇文章搞懂高级程序员、架构师、技术总监、CTO从薪资到技能的区别

    一篇文章搞懂高级程序员.架构师.技术总监.CTO从薪资到技能的区别 http://youzhixueyuan.com/senior-programmers-architects-technical-d ...

随机推荐

  1. es6基础系列三:解构赋值

    解构就是ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值(只能用于数组,对象或迭代器).如果解构不成功,则等于undefined,但不能赋值为undefined和null,因为undefi ...

  2. 2016 年排名 Top 100 的 Java 类库

    我们分析了GitHub中47,251个依赖,从中找出了排名前一百的Java类库,让我们看看谁在前面,谁在后面. 我们在漫长的周末的消遣方式就是浏览GitHub并且搜索流行的Java类库.我们决定把其中 ...

  3. .Net Core WebApi返回日期格式的问题

    环境:.net core 2.1 webapi 问题简介: 返回DateTime,前端接收到的字符有时候为2018-01-01T12:01:01,有时候为2018-01-01T01:01:01.722 ...

  4. kolla-build常用命令行详解

    --base-image 用于指定使用自己定制的基础镜像,不用官方网站的样例如下:kolla-build --base-image registry.access.redhat.com/rhel7/r ...

  5. Docker:容器与主机时间不同步问题解决

    在Docker容器运行后,可能会发现容器时间与宿主机时间不一致,一般会差8个小时.这样会造成在容器中运行的web程序打出的日志时间与实际时间不一致,如果web程序中有定时任务也会造成影响等,需要对宿主 ...

  6. Spark Streaming 的容错

    Spark Streaming 为了实现容错特性,接收到的数据需要在集群的多个Worker 节点上的 executors 之间保存副本(默认2份).当故障发生时,有两种数据需要恢复: 1. 已接收并且 ...

  7. bzoj2055: 80人环游世界(可行流)

    传送门 表示完全看不懂最小费用可行流…… 据某大佬说 我们考虑拆点,然后进行如下连边 $s$向$a_i$连边,权值$0$,容量$[0,m]$ $a_i$向$a_i'$连边,权值$0$容量$[v_i,v ...

  8. [Xcode 实际操作]三、视图控制器-(12)在Storyboard中使用集合控件

    目录:[Swift]Xcode实际操作 本文将演示集合控件在故事板中的使用. 在控制器根视图上点击鼠标,以选择该根视图. 现在往根视图中添加一个集合视图. 点击[库面板]图标,打开控件库面板 在控件库 ...

  9. php路径问题

    ./ 是在当前目录开始寻找文件/ 是在下一级目录开始寻找文件 ../ 这个是在上一级目录开始寻找文件 $_SERVER['DOCUMENT_ROOT']获取站点根目录 __FILE__获取当前文件的完 ...

  10. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(约束第K短路)

    题意:求11到nn的第kk短的路径长度,如果超过TT输出Whitesnake!Whitesnake!,否则输出yareyaredawayareyaredawa. 好无以为 , 这就是一道模板题, 当是 ...