JSON

JSON是什么

JSON(javascript object notation,javascript对象表示法)。JSON是javascript的一个严格的子集,利用了javascript中的一些模式来表示结构化的数据。关于JSON,最重要的理解就是它是一种数据格式,而不是一种编程语言。虽然具有相同的语法形式,但是JSON并不从属与javascript。它是一种数据格式,很多语言都有针对JSON的解释器和序列化器。

JSON是一种轻量级的数据交换语言(相对于XML来说),在web数据交换中取代XML成为主流。

语法:

  1. 简单值:使用和javascript相同的语法,五个基本类型(number,boolean,string,null,undefined)它只支持前四个,不支持undefined。注意,如果是字符串字面量,一定要用双引号,不能用javascript也支持的单引号。
  2. 对象:相比与javascript的对象字面量,JSON的对象没有声明变量(因为它没有变量的概念),JSON的属性值要使用双引号包括(javascript中属性使用双引号包含也是正确的写法,只不过大家都熟悉不用双引号罢了),因此,一个简单的JSON对象可以表示为
  3. {
         "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()进行解析和序列化。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。