Max—— 前端攻城狮 's Blog

A Simple pure blog generated by jekyll

JSON的学习和理解

<< Back

JSON的定义和特点

JSON(JavaScript Object Notation)是Javascript专家大牛Douglas Crockford(克劳福德)发明的一种轻量的数据格式。虽然他的语法部分参考了javascript的一些特性,可以称作Javascript的一个子集,但是他是可以独立于任何语言之外的一种通用的数据格式(文本格式),相比XML来说具有更轻量的特点。

简单来说,他是:

  • JavaScript 对象表示法(JavaScript Object Notation)。
  • 它是一种存储和交换文本信息的语法。类似 XML。
  • 它独立于语言层面(javascript)之外,可以被很多语言调用。类似XML。
  • 它比 XML 更小、更快,更易解析。

JSON可以表示三种类型的值:

第一种:简单值,包括字符串、数值、布尔值和null。但是不支持undefined

 "hello, world!"
    
23
    
true
    
null
    

第二种:数组值

["name",23]
    

第三种:对象值

{
	"name"   :  "hello",
	"age"    :  23
}
    

JSON中数组和对象页可以相互嵌套,比如:

[
	{
		"name"   :  "hello",
		"age"    :  23,
		"year"   : [2001, 2002, 2003, 2004]
	},
	{
		"name"   :  "hello",
		"age"    :  23,
		"year"   : [
					{
						"name"   :  "hello",
						"age"    :  23
					}, 2002, 2003, 2004]
	},
	{
		"name"   :  "hello",
		"age"    :  23
	},
	{
		"name"   :  "hello",
		"age"    :  23,
		"year"   : [[1,2,3], 2002, 2003, [10,11,12]]
	}
]
    

但是对比javascript语法,我们能够看出他的语法特点:

  • 只能使用双引号(单引号是不被允许的,会报语法错误);
  • 对象的属性必须加上双引号;
  • 没有变量,没有操作符,没有赋值语句,也没有分号;

JSON的解析和序列化

JSON在WEB开发中非常流行,以至于成为了事实标准,甩开XML十条街不止的原因,除了跟Javascript有相似的语法之外,还有一个很重要的原因就是能够非常方便的通过很简单地两个函数在javascript对象和json数据之间互相置换:

  • stringify()—— 该方法将javascript对象序列化成JSON字符串;
  • parse()—— 该方法将JSON字符串解析成javascript对象;

ECMAScript5标准定义了一个专门处理json的解析和序列化的对象—— JSON对象

JSON的序列化

var text = {
	name : "hello,world",
	age  :  25,
	year :  2014
};

var json_text = JSON.stringify(text);
console.log(json_text);    //  {"name":"hello,world","age":25,"year":2014}
    

stringify()方法可以接受两个参数,两个参数都是可选的。第一个参数是过滤器,过滤后可以只包含数组或者函数中需要的值;

var text = {
	name : "hello,world",
	age  :  25,
	year :  2014
};

var json_text = JSON.stringify(text ,["age","year"]);
console.log(json_text);    // {"age":25,"year":2014} 

    

第二个参数是定义是否缩进,如果是数字,代表缩进的空格数(最大是10),并且包含换行;如果是字符串,会被当做缩进符;

var text = {
	name : "hello,world",
	age  :  25,
	year :  2014
};

var json_text = JSON.stringify(text ,["age","year"],4);
console.log(json_text);    
/*
{
    "age": 25,
    "year": 2014
} 
*/

    

如果定义第二个参数时,需要缺省第一个参数,可以用null代替;

var text = {
	name : "hello,world",
	age  :  25,
	year :  2014
};

var json_text = JSON.stringify(text ,null,4);
console.log(json_text);    
/*
{
    "name": "hello,world",
    "age": 25,
    "year": 2014
} 
*/

    

JSON的解析

var text = {
	name : "hello,world",
	age  :  25,
	year :  2014
};
var json_text = JSON.stringify(text);

var json_text_data = JSON.parse(json_text);

console.log(typeof text);             //  object
console.log(typeof json_text_data);   //  object
console.log(text===json_text_data);   //  false

    

虽然text和json_text_data都是对象,并且具有相同的属性,但是他们是两个独立的、没有任何关系的对象。

发表于: 11 Oct 2014