JSON
JSON是什么
JSON(javascript object notation,javascript对象表示法)。JSON是javascript的一个严格的子集,利用了javascript中的一些模式来表示结构化的数据。关于JSON,最重要的理解就是它是一种数据格式,而不是一种编程语言。虽然具有相同的语法形式,但是JSON并不从属与javascript。它是一种数据格式,很多语言都有针对JSON的解释器和序列化器。
JSON是一种轻量级的数据交换语言(相对于XML来说),在web数据交换中取代XML成为主流。
语法:
- 简单值:使用和javascript相同的语法,五个基本类型(number,boolean,string,null,undefined)它只支持前四个,不支持undefined。注意,如果是字符串字面量,一定要用双引号,不能用javascript也支持的单引号。
- 对象:相比与javascript的对象字面量,JSON的对象没有声明变量(因为它没有变量的概念),JSON的属性值要使用双引号包括(javascript中属性使用双引号包含也是正确的写法,只不过大家都熟悉不用双引号罢了),因此,一个简单的JSON对象可以表示为
-
{ "name" : "aby", //分隔用逗号,属性名要用双引号包括起来 "age" : 18 }
3.数组:JSON中第二种复杂的数据结构类型是数组,采用的是数组字面量的形式,例子如,下面是javascript中的数组字面量:
var value = [25, "aby", true];
在JSON中,表示为:[25, "aby", true] //注意这里没有分号,因为不是javascript语句,所以不需要引号,又因为它没有变量的概念,所以就没有value
当然啦,数组和对象还可以相互嵌套,使其更加复杂
{ "firstName": "John", "lastName": "Smith", "male": true, "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }
何时是JSON,何时不是JSON?
JSON是设计成描述数据交换格式的,他也有自己的语法,这个语法是JavaScript的一个子集。
{
"prop": "val" }
这样的声明有可能是JavaScript对象字面量也有可能是JSON字符串,取决于什么上下文使用它,如果是用在string上下文(用单引号或双引号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。来看具体的例子:
// 这是JSON字符串 var foo = ‘{ "prop": "val" }‘; // 这是对象字面量 var bar = { "prop": "val" };
读取 JSON
由于 JSON
是javascript 的子集,所以一般都会使用 eval()
作为读取数据的方式,如果是针对可靠的数据来源,在不支持原生
JSON 解析的浏览器上面这是最快速的方法。然而由于 eval 方法同样可以执行任意的 JavaScript
代码,因此当数据来源不可靠时则可能产生安全性问题。如下面的例子,直接用 eval 执行时会跳转:
var json = { message: (function () { window.location=‘http://zh.wikipedia.org/wiki/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C‘; })() };
其中一种防止不安全代码出现的解决办法,是通过浏览器原生支持的 JSON.parse(str) 方法读取 JSON
数据,目前已经得到大部分主流浏览器的支持(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支持原生 JSON
对象的浏览器上面可以使用 parseJSON
方法进行读取,parseJSON
采用解析器验证读入的代码是否真的是
JSON
代码,这样就提供了较好的安全性。但由于这是用模拟的方式读取,速度上会比 eval()
慢。
JSON对象
ECMAScript 5对解析JSON的行为进行了规范,定义了一个原生的全局变量JSON对象,浏览器的支持(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+)。对于较老的版本浏览器,可以使用一个是shim: https://github.com/douglascrockford/JSON-js
JSON对象有两个方法:stringify()和parse(),前者为序列化为JSON字符串,后者为解析JSON字符串。
用法为:
// 这是JSON字符串,比如从AJAX获取字符串信息 var my_json_string = ‘{ "prop": "val" }‘; // 将字符串反序列化成对象 var my_obj = JSON.parse( my_json_string ); alert( my_obj.prop == ‘val‘ ); // 提示 true, 和想象的一样! // 将对象序列化成JSON字符串 var my_other_json_string = JSON.stringify( my_obj );
其中stringify()方法除了接受要序列化的参数外,还可以接收两个参数,第一个参数是一个过滤器(可以是一个数组,也可以是一个函数),第二个参数为一个数值,控制结果中的缩进和空白符的空格个数。具体用法大家自行谷歌之。还可以自定义toJSON方法,返回其自身的JSON数据格式(如将Date自动转换为ISO 8601格式)。
JSON.parse也可以接收一个额外的参数,是一个函数,成为还原函数,和stringify的过滤函数差不多,都接收两个参数,一个键和一个值,用以处理需要特殊解析的键值对,具体情况大家也自行谷歌。
总结
JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量,它使用javascript语法子集表示number,string,boolean,null,对象和数组,不支持undefined。
ECMAScript 5对解析JSON的行为进行了规范,定义了一个原生的全局变量JSON对象,可以通过JSON.parse()和JSON.stringify()进行解析和序列化。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。