关于JSON

  之前一直误以为JavaScript中的对象字面量(Object Literals)就是JSON对象,因为它的语法和JSON规范里描述的一样,但是该规范也明确地说了JSON只是一个数据交换语言,只有我们将其用在string上下文的时候它才叫JSON。

序列化与反序列化

  两个程序(或服务器、语言等)需要交互通信的时候,他们倾向于使用string字符串因为string在很多语言里解析的方式都差不多。复杂的数据结构经常需要用到,并且通过各种各样的中括号{},小括号(),方括号[]和空格来组成,这个字符串仅仅是按照要求规范好的字符。

  为此,我们为了描述这些复杂的数据结构作为一个string字符串,制定了标准的规则和语法。JSON只是其中一种语法,它可以在string上下文里描述对象,数组,字符串,数字,布尔型和null,然后通过程序间传输,并且反序列化成所需要的格式。YAML和XML也是流行的数据交换格式,但是作为前端开发人员都喜欢JSON。

字面量

  1. 它们是固定的值,不是变量,让你从”字面上”了解脚本。
  2. 字符串字面量是有双引号(”)或单引号(’)包围起来的零个或多个字符组成的。
  3. 对象字面量是由大括号({})括起来的零个或多个对象的属性名-值对。

何时是JSON,何时不是JSON?

  JSON是设计成描述数据焦金环格式的,它也有自己的语法这个语法是JavaScript的一个子集。{ “prop”: “val” } 这样的声明有可能是JavaScript对象字面量也有可能是JSON字符串,取决于什么上下文使用它,如果是用在string上下文(用单引号或双引号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。

1
2
3
4
5
//这是JSON字符串
var foo = '{"prop" : "val"}';
//这是对象字面量
var bar = {"prop" : "val"};

  而且要注意,JSON有非常严格的语法,在string上下文里{“prop” : “val”}是个合法的JSON,但是{prop : “val”}确实不合法。所有属性名称和它的值都必须用双引号引住,不能使用单引号。另外,即便你使用了了转义以后的单引号也是不合法的,详细的一发规则可以这里查看

真正的JSON对象

  开头已经提到,对象字面量不是JSON对象,但是有真正的JSON对象。但是两者完全不一样概念,在新版的浏览器里JSON对象已经被原生的内置对象了,目前有2个静态方法:JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但可以通过json2.js来实现同样的功能。

可以参考下边的例子:

1
2
3
4
5
6
7
8
9
10
// 这是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 );



参考文章:http://www.cnblogs.com/zichi/p/4360219.html

谢谢你请我吃糖果