JSON即JavaScript Object Notation,是一种轻量级的数据交换格式,易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

1、“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2、值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

JSON其实是后XML时代的产物,在XML被大家广泛接受的时候,人们开始注意到XML的冗余数据了,所以有人就在想一些XML的变种,什么BinaryXML之类的,JSON差不多就在这个年代出生了。
我们先看一个XML:

<request>
<firstName>Zhang</firstName>
<lastName>San</lastName>
<email>poorren@poorren.com</email>
</request>

这个XML中,每个标签都出现了2次,用了这么多流量了,何况中国这网络,当然比俄罗斯用铁丝当网线好,哈哈。
那么对应的JSON会是什么样子的呢?将上面xml例子转为json即为:

{“firstName”:”Zhang”,”lastName”:”San”,”email”:”zhangsan@poorren.com”}

这样标签只出现了一次,节约了点儿空间,名称:值,成对出现.来个复杂点儿的例子:

{ “people”: [
{ “firstName”: “Zhang”, “lastName”:”San”, “email”: “zhangsan@poorren.com” },
{ “firstName”: “Li”, “lastName”:”Si”, “email”: “lisi@poorren.com” },
{ “firstName”: “Wang”, “lastName”:”Wu”, “email”: “wangwu@poorren.com” }
]}

一个标签下面有多个标签的时候用[]来括起来。有点儿基础的朋友看了这个介绍应该都会了,我也不继续往下面说了,也没有什么好说的了。 接下来看看JS中怎么使用JSON。
JSON是JavaScript对象描述符号(object literal notation)的一个子集。正因为JSON是JavaScript的子集,所以在JavaScript中我们可以很容易的使用它。并且不需要什么第三方文件就能够解析。
下为json声明的例子

var myJSONObject = {“bindings”: [
{“ircEvent”: “PRIVMSG”, “method”: “newURI”, “regex”: “^http://.*”},
{“ircEvent”: “PRIVMSG”, “method”: “deleteURI”, “regex”: “^delete.*”},
{“ircEvent”: “PRIVMSG”, “method”: “randomURI”, “regex”: “^random.*”}
]};

这个例子中,创建了一个对象,它只包含一个成员“bindings”。“bindings”是一个包含了3个对象的数组,而这每个对象都有”ircEvent”、”method”和”regex”3个成员。

这些成员可以用“.”或subscript 操作得到。

myJSONObject.bindings[0].method // "newURI"

我们可以使用eval()函数的eval()方法调用JavaScript的编译器把JSON文本转变成对象。因为JSON是JavaScript的一个确切的子集,编译器可以正确地解析JSON文本,然后生成一个对象结构。

var myObject = eval('(' + myJSONtext + ')');

eval函数的执行效率很高。然而,它能够编译、执行任何的JS程序,所以这样会有安全问题。在来源可信的时候才需要使用eval,这通常是服务器提供基础页面和JSON数据的web应用程序中的情形。而很多情况中,来源是不可信的。特别是永远都不要信任客户端。

如果关心安全的话,那最好是使用JSON解析器了(js脚本中有解析功能的函数)。JSON解析器只认可JSON文本,因此它比较安全:

var myObject = myJSONtext.parseJSON();

而JSON的字符串转换器(stringifier)则作相反的工作,它将JavaScript数据结构转换为JSON文本。JSON是不支持循环数据结构的,所以注意不能把循环的结构交给字符串转换器。

var myJSONText = myObject.toJSONString();

另外,在JS中,任何Obj都有toJSONString()方法,下为JSON元素转换字符串示例:

String newJSONtext = people.toJSONString();

这里是JSON官方网站提供的一个开源的javascript下JSON解析器和字符串转换器json2.js,有需要的可以下载试试。