关于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 控制台查看的结果。