Json作为一种轻量级的数据传输方式,在平时的开发中使用的非常广泛,本人也是在开发过程中使用的较多,但是就像最近看的一部电影中讲到的一样,有时候就是和你天天在一起你觉得最熟悉的人其实你并不熟悉。今天去参加了一个面试,中间问到了json的相关问题,顿时就有这种体会了。在此详细总结一下也是提醒自己以后学习的过程中不要总追求最新的、最前沿的,把和自己最熟悉的最普通的真正弄熟悉才是最大的提示。
1、介绍
关于JSON*这样定义的:
JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。
存在形式如下(具体参考RFC 4627):
- 对象(object):一个对象以“{”开始,以“}”结尾,包含一系列的键值对,各键值对直接使用“,”分割
- 键/值对:键名和值之间使用冒号“:”分割,键名是一个字符串,值可以是字符串、数组、对象、数值、布尔值、或者null
- 数组:一个或多个值用逗号分割“,”,使用“[”、“]”括起来形成
- 字符串:必须是用双引号括起来的字符串,注意不能是单引号
- 数值:一系列0-9的数字组合,可用负数和小数,可以用“e/E”表示指数形式的数
虽然在1999年的《JavaScript Programming Language, Standard ECMA-262 3rd Edition》中就讲到JSON,是其子集和,可以在Javascript中用eval函数解析调用:
var txt = ‘{"table": [‘ + ‘{"a":"123","b":"456","c":"678"},‘+ ‘{"aa":"123","bb":"456","cc":"678"} ]}‘; var obj = eval( "(" + txt + ")" ); //然后可使用javascript对象 obj.table[0].a
但是这并不代表JSON无法使用其他语言,事实上几乎所有与网页开发相关的语言都实现了各自的JSON库。JSON是轻量级的文本数据交换格式,主要有以下特点:
- 是纯文本
- 独立于语言
- 具有自我描述性,更易于理解(键值对的自我描述,人类可读)
- 具有层级结构(值中存在值)
- 可通过javascript解析,可使用Ajax进行传输、
2、与XML的比较
JSON是存储和交换文本信息的一种语法,与XML相比主要有如下优点:
- 比XML更快更易使用,读写速度更快
- 没有标记标签,文本更短
- 使用数组、不使用保留字
- 使用内建的eval函数即可进行解析
- ...
尽管XML拥有跨平台、跨语言的优势,但是除非应用Web Sevice,否则一般情况下的Web开发,在服务器端和客户端生成和处理XML都需要相比JSON来说更加复杂的代码,降低了开发效率。同时对于大多数Web开发来说,不需要复杂的XML来传输数据,其扩展性很少具有优势。
3.数据格式解析
前面提到与XML一样,JSON也是纯文本数据格式,其格式非常简单。归根结底,最终都是存储字符串string,这里string的完整表示结构如下:
JSON文本中的字符串必须以双引号括起来,需要将双引号(")、斜杠(/)、反斜杠(\)和控制字符进行转义,其他的Unicode字符使用\Uxxxx的形式即可直接输出。
一个数值可以用下图表示其结构:
正负号、小数、科学计数法,这些都是可以在JSON文本中直接使用,而且数值类型不用引号括起来。
Boolean类型使用true、false表示,也是没有用引号括起来的,否则会被视为字符串。
至于数组([])、对象({})都是对上述基本类型的封装,各个键名和值直接使用冒号分割,各个键值对之间使用逗号分割。
4、服务器端输出
服务器端的语言一般都封装了json输出库函数。这些函数的实现也就是构造了符合JSON格式的字符串,但是中间最关键的问题是处理好特殊字符。
必须使用双引号而不能是单引号表示字符串,对每个需要进行转义的字符(\、\\、/、\b、\f、\n、\r、\t)进行转义,对输出结果的MINE类型使用“Content-Type: application/json;charset=UTF-8”。除此之外,需要进行递归调用,将带转换的对象按照层级关系转换成对应的JSON文本。
JSON最开始就被广泛应用于Web2.0的各种开发,在Web数据传输方面起着重要的作用。现今,在非关系型的数据库中应用也较广泛,基于文档存储的NoSQL的存储键值对的非关系型数据库就选择JSON 格式来作为其数据存储格式。