JSON是什么??(可参考JS高级程序设计第4版第703页)
一种存储数据的数据格式
可以理解为类似数组的数据格式,栗子:
<script>
var json = {a: 1, b: 2, c: 3};
var arr = [3, 4, 5,];
console.log(json.a);
console.log(json['a']);
console.log(arr[0]);
</script>
运行结果: 1
1
3
JSON和数组的差别:
1、JSON的下标是字符串,数组的下标是数字
2、还有个区别,数组有length,但JSON没有。
说到没有length属性,那么就得聊到for循环。
数组循环很简单,就是
for(let i=0; i<arr.length; i++){
console.log(arr[i]);
}
还可以用for-in方法:
for( let i in arr) {
console.log(arr[i]);
}
那么JSON就可以用for-in
for( let i in json) {
console.log("json[i]");
}
JSON对象
JSON中必须使用双引号,而且属性名要用双引号包围起来
JS标准对象字面量:
let object = {
name: "liang",
age: 18
};
JSON表示:
let object {
"name": "liang";
"age": 18
};
JSON的迅速流行,不仅是因为它的语法与JS相似,很大程度上还因为JSON可直接被解析为可用的JS对象。与解析为DOM文档的XML相比,这个优势非常明显。
栗子: 用JSON获取第三本书的书名:
books[2].title
解析为DOM的XML:
document.getElementByTagName("books")[2].getAttribute("title");
JSON对象的两个方法
1、JSON.stringfy() (序列化,替代函数)
把一个JS对象序列化为一个JSON对象。默认情况下,输出不包含空格或缩进的JSON字符串,并且值为undefined的任何属性会被跳过。
栗子:
let lee = {
name: "梁什么鸭",
Englishname: "Lee",
age: 18,
appearance: [
hair: "short",
stature: "163cm"
]
};
let jsonText = JSON.stringfy(lee);
jsonText的值: { "name": "梁什么鸭", "Englishname": "Lee", "age": 18, "appearance": [ "shorhairt", q"163cm" ] }
stringfy()可以传入三个参数:
第一个是要序列化的对象名
第二个是要从序列化对象中获取的属性键值对
第三个是缩进格数或缩进方式:
即若传入的是一个数字,那么就是缩进的空格数(最大缩进值为10,大于10的值会自动设置为10);
若传入的是一个字符串,那么就是以这个字符串进行缩进。
toJson方法
有时,对象需要在JSON.stringfy()上自定义JSON序列化。
此时,可在要序列化对象中添加toJSON()方法,序列化时会基于这个方法返回适当的JSON表示,栗子:
let lee = {
name: "梁什么鸭",
Englishname: "Lee",
age: 18,
appearance: [
hair: "short",
stature: "163cm"
],
toJSON: function() {
return this.name;
}
};
let jsonText = JSON.stringfy(lee);
jsonText的值为 “梁什么鸭”。
2、JSON.parse() (解析,还原函数)
会对每个键值对都调用一次。
如果返回undefined,结果中就会删除响应的键,如果返回其他值,该值就会称为相应键的值插入到结果中,常用于把日期字符串转换为Date对象。
栗子:
let lee = {
name: "梁什么鸭",
Englishname: "Lee",
age: 18,
appearance: [
hair: "short",
stature: "163cm"
]
releaseDate:new Date(2021, 5 , 3)
};
let jsonText = JSON.stringfy(lee);
let leeCopy = JSON.parse(jsonText,
(key, value) => key == ""releaseDate" ? new Date(value) : value);
alert(leeCopy.releaseDate.getFullYear());