JSON是一种轻量级的数据交换格式,全称——JavaScript 对象表示法(JavaScript Object Notation)。
类比XML,你可以把JSON看作是一种存储数据的格式类型,一种数据规范。
描述JSON格式数据的语法采用了JS对象字面量的表示方法,但是你不能的把JS对象就看做是JSON了,同XML一样JSON只是一种存储数据的类型,它是独立于语言存在的,只是在不同的编程语言中对这种数据类型的实现不同,例如在JavaScript中使用JavaScript对象对这种数据格式进行实现,那么在java中当然是用java对象实现。
同时,既然JSON这种数据格式用JS对象字面量的表示方法进行描述,那么描述JSON的语法就是JS对象字面量表示法语法的一个子集。如下图所示:
下面我们看一下js对象的字面量表示法,及JSON格式的数据是怎么用这种语法实现的。
<script type="text/javascript"> //这是一个js对象,属性不加"",符合js对象的字面量表示法语法但不符合JSON语法。 var jsObj1 = { name : "张三" } //这是一个内部带有方法js对象,虽然属性加了"",但JSON的语法中属性的值不能是方法。 var jsObj2 = { "name" : "张三", "func" : function(){ alert("hello"); } } //这是一个符合JSON数据格式的js对象,是JavaScript语言中对JSON这种数据格式的实现形式,也是我们常说的"JSON对象"。 //这种JS对象字面量的表示方法,也就是"JSON对于其数据形式规范的语法",所以说"JSON的语法就是JS对象字面量表示法语法的一个子集"。 var jsonObj = { "name" : "张三", "age" : 10, "remark" :{ "high" : 170 ,"address" : "beijinghaidian" } } </script>
其实对于"js对象的字面量表示法"中属性加不加引号是"js对象"还是"JSON对象的说法本身就是错误的,加与不加引号它都是"js对象",只是你加了引号以后,从语法上来说符合JSON的语法规则,而JSON的语法规则又是"js对象的字面量表示法"语法规则的子集,所以无论怎么表示,他都是一个"js对象"。那么有没有属性必须要加引号的情况呢?我们知道js对于变量的命名规则是数字、字母、下划线及$符号,属性不加引号时也符合这个规则,但要是属性中有这四种之外其它的符号如"[" 或者 "."等等,属性就必须引号来表示。
说到底,JSON是一种数据格式,一种对于数据的规范,因为其居有自我描述性及简洁的语法规则,让它成为了一种在不同语言之间理想的数据交换的格式,JSON独立于语言而存在,任何站在语言的角度及对象层面对他的解释都是有局限性或者是错误的。
参考文章:
(1):http://www.json.org.cn/index.htm
(2):http://www.w3school.com.cn/json/json_syntax.asp