9. json
json格式的数据:
作用:浏览器端和服务器端发送请求传输数据,使用最多的格式
语法:属性名和属性值必须加上 “”
json格式对象和json格式字符串相互转化的问题:
json格式对象–>json格式字符串: JSON.stringify(对象)
json格式字符串–>json格式的对象: JSON.parse(json格式字符串)
parse: 解析
stringify: 字符串化
注意:
- 对象向json格式字符串转化,没有严格要求,通过stringify可以完成转化,并且给属性和属性值,都加上双引号
- 如果不是json格式的字符串,无法通过parse方法还原解析成对象
var jsonStr1 = "{'name':'yuonly','age':18}";//不是json格式的字符串 //var json1 = JSON.parse(jsonStr1);// 不是json格式字符串,无法parse转化为对象 //console.log(json1, typeof json1); var json2 = { // 不是json格式的对象 'name':'atguigu', age:19 } var jsonStr2 = JSON.stringify(json2);// 可以转化,不会报错,转化完是加""的json格式字符串 console.log(jsonStr2,typeof jsonStr2);
9-1. JSON.parse-JSON.stringify
var json1 = {
“name”: “atguigu”,
“age”: 18// 数组类型的值可以不用加""
}
console.log(json1, json1.name, json1.age, json1[“name”], json1[“age”]);
var jsonStr1 = JSON.stringify(json1);
console.log(jsonStr1, typeof jsonStr1);
var jsonStr2 = ‘{“name”:“atguigu”,“age”:18, “sex”:“男”}’;
var json2 = JSON.parse(jsonStr2);
console.log(json2,json2.name,json2[‘age’],json2.sex);
9-2. 通过json转化拷贝对象
对属性的拷贝是深拷贝。
但是不能拷贝对象中的方法
// 引用数据类型,不能通过 赋值来赋值一个新的,因为是地址的传递,操作的还是同一个堆内存
var obj1 = {
name:'atguigu',
age:18
}
var obj2 = obj1;
obj2.name = '尚硅谷';
console.log(obj1.name);// 尚硅谷
// 通过json转化,对对象进行拷贝,可以拷贝属性,属性也可以进行深拷贝
// 不能够拷贝方法
var obj1 = {
name:'atguigu',
age:18,
address:{
city:'北京'
},
say:function(){
console.log('say');
}
}
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log('obj2: ',obj2);
obj1.name = '尚硅谷';
console.log(obj1,obj2);// 实现了对象复制
obj1.address.city = '上海';
console.log(obj1,obj2);
console.log(obj1.address === obj2.address);
9-3. JSON转化数组
可以将元素都是对象的数组,转化为JSON格式的字符串。
还可以将其还原成元素是对象的数组
var arr = [
{
id:1,
title:'今天天气不错,挺风和日丽的',
isDone:true
},
{
id:2,
title:'学习json',
isDone:false
}
];
var arrStr = JSON.stringify(arr);// 可以将元素是对象的数组,转化为JSON格式的字符串
console.log('arrStr: ', arrStr,typeof arrStr);// json格式的数组 - 字符串
var newArr = JSON.parse(arrStr);
console.log(newArr , newArr instanceof Array, Array.isArray(newArr));
console.log(newArr[0].title);//可以还原成数组和对象