JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量。
JSON使用Javascript的语法的子集表示对象,数组,字符串,数值,布尔值和null。
JSON的语法可以表示如下三种类型的值:
简单值:使用与Javascript相同的语法。可以在JSON中表示字符串,数值,布尔值和null。但JSON不支持Javascript的特殊值undefined
对象:表示一级无序的键值对。
数组:表示一级有序的列表,可以通过数值索引来访问其中的值。 数组的值也可以是任意 类型——简单值,对象或 数组
JSON不支持变量,函数或对象实例。它就是一种 表示结构化数据的格式。
简单值 :
"Hello World!"
对象:
JSON中的对象 与JS字面量稍微有点不同。
字面量表示:
var Object = {
'name': 'Jin',
'age': 29
};
JSON:
{
"name": "Jin",
"age": 29
}
{
"name":"Jin",
"age":29,
"school": {
"name":"First school",
"location":"sz"
}
}
数组:
[
{
"title":"Professional Javascript",
"authour":[
"Nicholas"
],
edition:3,
year:2011
},
{
"title": "Professional Javascript",
"authour": [
"Nicholas"
],
edition: 3,
year: 2009
},{
"title": "Professional Javascript",
"authour": [
"Nicholas"
],
edition: 3,
year: 2007
}
]
解析与序列化:
books[2].title
JSON对象
JSON对象有两个方法:stringify()和parse().这两个方法分别用于把Javascript对象序列化为JSON字符串和
把JSON字符串解析为原生Javascript值。例如:
var book = {
title: "Professional Javascript",
authors: [
"Nichilas"
],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText);
console.log(jsonText); //{"title":"Professional Javascript","authors":["Nichilas"],"edition":3,"year":2011}
序列化选项
JSON.stringify()还可以接收另外两个参数。第一个参数是过滤器,可以是一个数组。第二个参数是一个选项,表示是否存在JSON字符串中保留缩进。
var book = {
title: "Professional Javascript",
authors: [
"Nichilas"
],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book, ["title", "edition"]);
console.log(jsonText); //{"title":"Professional Javascript","edition":3}
字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和 空白符。
例如,要在每个级别缩进4个空格,可以这样写代码:
toJSON()方法
有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求,可以给对象定义toJSON()方法,返回其自身的JSON数据格式。
var book = {
title: "Professional Javascript",
authors: [
"Nichilas"
],
edition: 3,
year: 2011,
toJSON: function() {
return this.title;
}
}
var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText); //"Professional Javascript"
解析选项
JSON.prase()方法也可以接收另一个参数。该参数是一个函数。将在每个键值对儿上调用。为了区别JSON.stringify()接收替换(过滤)函数(replace),这个函数还被称为还原函数(reviver)。
它们接收两个参数,一 个键和一个值。都需要返回一个值。
如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到 结果中。在将日期字符串转换为Date对象时,经常要用到还原函数。
<script>
var book = {
"title": "Professional Javascript",
"authors": [
"Nicholas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 11)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value) {
if (key == "releaseDate") {
return new Date(value);
} else {
return value;
}
})
console.log(bookCopy.releaseDate.getFullYear()); //2011
</script>
以上代码先是为book对象新增了一个releaseDate属性,该属性保存着一个Date对象。这个对象在经过序列化之后变成了有效的JSON字符串,然后经过解析双在bookCopy中还原为一个Date对象。还原函数在遇到releaseDate键时,会基于相应的值创建一个新的Date对象。结果就是bookCopy.releaseDate属性中会保存一个Date对象。