JavaScript JSON 格式操做

  关于JSON,最重要的是要理解它是一种数据格式,而不是一种编程语言。虽然具备相同的语法,但JSON并不从属于JavaScript。并且,并非只有JavaScript才使用JSON,毕竟JSON只是一种数据格式。不少编程语言都有针对JSON的解析器和序列化器。javascript

  首先,说一下JSON的语法,JSON由三种类型组成,简单、对象、数组。简单值包括数值、字符串、布尔值、null。对象由一组键值对组成,其中能够嵌套数组和对象。数组表示一组有序的值得列表,能够包含数组和对象。java

console.log(JSON.parse(1))

  这样写是没有错的,能够直接解析数值,可是这个没有意义,通常实际运用中JSON都是以对象或数组的方式呈现。下面看看对象的表示法:编程

{
	"name" : "Miracle",
	"age" : 24
}

[1,2,"sd"]

  JSON的对象和数组与JavaScript的对象字面量和数组字面量很像,在JSON中全部的键都要用双引号包裹,不然会致使语法错误。而字符串的值也必须使用双引号包裹,不能使用单引号,由于会致使语法错误,在数组中也是同样。在JSON中对象能够包含数组,而一样数组也能够包含对象。数组

{
	"name" : "Miracle",
	"age" : 24,
	"skills" : ["AJAX", "ES5", "HTML5", "CSS3"],
	"friends" : [
		{
			"name" : "kirs",
			"age" : 23
		},
		{
			"name" : "HQ",
			"age" : 22
		}
	]
}

  上列代码最外围是一个对象,其中包含了2个简单值,和两个数组,而第二个数组"friends"中又包含了两个对象。浏览器

  

  解析与序列化数据结构

  在JSON对象诞生以前,JSON的解析一直是使用eval()函数,使用eval()对JSON数据结构求值存在风险,由于可能会执行一些恶意代码。ECMAScript 5对解析JSON的行为进行了规范,定义了全局对象JSON。支持这个对象的浏览器有IE8+、Firefox 3.5+、Safari 4+、 Chrome 和Opera 10.5+。编程语言

  JSON对象有两个方法:stringify()和parse()。stringify()用于将JSON对象的实例转换为JSON字符串,而JSON.parse()则将一个JSON字符串解析为JSON对象。函数

var jobj = {
	"name" : "Miracle",
	"age" : 24
}

var jtext = JSON.stringify(jobj);

console.log(jtext);			//'{"name":"Miracle","age":24}'
console.log(typeof jtext);	//string

var obj = JSON.parse(jtext);
console.log(obj.name);		//"Miracle"

  在执行JSON.stringify()方法的时候对于JS中的特殊值好比undefined,function类型会忽略掉当前的键值对。对象

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"un" : undefined,
	"getName" : function(){
		alert(0);
	}
}

console.log(JSON.stringify(jobj)); //'{"name":"Miracle","age":24}'

  上述代码中jobj对象中包含了一个键为"un",它的值是undefined因为JSON不识别这种基本类型,因此会将键和值所有忽略。JS中的funciton也是。blog

  JSON.stringify()方法一共有三个参数,第一个参数是要转化的对象,这个参数是必选项,第二个参数是过滤设置,能够是数组,也能够是function。第三个参数是一个格式化的设置,能够是字符串或者数值。注意这里的过滤和格式化都是对对象的操做。

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"siklls" : ["AJAX", "ES5", "HTML5", "CSS3"]
}

console.log(JSON.stringify(jobj, ["name"])); //'{"name":"Miracle"}'

  若是JSON.stringify()方法的第二个参数是一个数组,那么在执行的时候会匹配数组中的值与每一个键的名称是否同样,若是有返回这个键值对,没有就忽略。若是一个都没有最终返回空对象字符串"{}"。

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"siklls" : ["AJAX", "ES5", "HTML5", "CSS3"]
}

var s = JSON.stringify(jobj, function(key, val){
	if(key == "name"){
		return "who are you?";
	}else if(key == "siklls"){
		return undefined;
	}else {
		return val;
	}
});

console.log(s);		//{"name":"who are you?","age":24}

  若是JSON.stringify()第二个参数是函数,那么根据函数返回的值来来匹配,若是函数自始至终都没有返回,那么结果就是undefined。这个函数接受两个参数,当前的键和值,而后根据结果返回当前键和改变后的值。例如代码中else if判断中 结果返回了undefined ,前面说过了若是返回的不是JSON类型的数据,JSON会自动过滤。

  JSON.stringify()方法的最后一个参数是用来格式化字符串。改参数是一个字符串或者数值类型。若是是数值,则使用当前数值的空格数来缩进,若是是字符串则使用字符串来缩进,注意,这里会自动换行。

 

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"siklls" : ["AJAX", "ES5", "HTML5", "CSS3"]
}

var s = JSON.stringify(jobj, null, 4);

console.log(s);	

 

上图是使用Chromg 控制台查看的结果。

相关文章
相关标签/搜索