1.对象
JavaScript对象字面量的表达方式:
var person = {
name: "Nicholas",
age: 29
};
当然,也可以写成这样:
var person = {
"name": "Nicholas",
"age": 29
};
JSON表示上述对象的方式如下:
{
"name": "Nicholas",
"age": 29
}
与JavaScript的对象字面量相比,JSON对象有两个地方不一样:1. 没有声明变量;2. 末尾没有分号;==在JSON中对象的属性必须加双引号!==属性的值可以是简单值,也可以是复杂类型值
{
"name": "Nicholas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}
2.数组
JavaScript中的数组字面量:
var values = [25, "hi", true];
JSON数组
[25, "hi", true]
JSON数组也没有变量和分号
3.JSON对象
JSON对象有两个方法:stringify()和 parse()
JSON.stringify() 方法将一个JavaScript值转换为一个JSON字符串,如果指定了一个replacer函数,则可以替换值,或者如果指定了一个replacer数组,可选地仅包括指定的属性。
举个例子
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book, function(key, value){
switch(key){
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
如果函数返回了undefined,那么这个值对应的属性会被删除。最后一定要提供default项,此时返回传入的值,以便其他值都能出现在结果中。缩进字符串最长不能超过 10 个字符长。如果字符串长度超过了 10 个,结果中将只出现前 10 个字
符。
toJSON()方法
举个栗子
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas","mihaibo","hanyanna"
],
edition: 3,
year: {
lastyear:2016,
nextyear:2018,
toJSON:function () {
return this.lastyear;
}
}
};
var jsonText = JSON.stringify(book,null,4);
console.log(jsonText);
// 返回一下字符串:
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas",
"mihaibo",
"hanyanna"
],
"edition": 3,
"year": 2016
}
可以让这个方法返回 undefined,此时如果包含它的对象嵌入在另一个对象中,会导致
它的值变成 null,而如果它是顶级对象,结果就是 undefined
序列化该对象的顺序如下:
(1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3) 对第(2)步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。
ps:在将日期字符串转换为 Date 对象时,经常要用到还原函数
举个栗子:
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
};
var jsonText = JSON.stringify(book,null,4);
// console.log(jsonText);
var bookCopy = JSON.parse(jsonText, function(key, value){
if (key == "releaseDate"){
return new Date(value);
} else {
return value;
}
});
console.log(bookCopy.releaseDate.getFullYear()); //2011