一、JSON对象的两个方法:JSON.parse() 和 JSON.stringify() 最普通的用法对象与字符串之间的互相转换
eg:
let abj = {name: 'zhang', xb: '男', nl: '23'}
let str = JSON.stringify(abj)
console.log(str)// '{name: 'zhang', xb: '男', nl: '23'}'
let newObj = JSON.parse(str)
console.log(str)// {name: 'zhang', xb: '男', nl: '23'}
二、JSON.parse()和JSON.stringify()的其他用法,可以在实际应用中给我们带来一些方便。
1、JSON.parse()
JSON.parse()可以接受第二个参数,它可以在返回之前转换对象值。比如这例子中,将返回对象的属性值大写:
let user = {
name: 'John',
email: 'john@awesome.com',
plan: 'Pro'
};
let userStr = JSON.stringify(user);
let newUserStr = JSON.parse(userStr, (key, value) => {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
});
console.log(newUserStr); //{name: "JOHN", email: "JOHN@AWESOME.COM", plan: "PRO"}
注:尾随逗号在JSON 中无效,所以如果传递给它的字符串有尾随逗号,JSON.parse()将会抛出错误。
2、JSON.stringify()
JSON.stringify(value[, replacer[, space]])
JSON.stringify()可以带两个额外的参数,第一个是替换函数,第二个间隔字符串,用作隔开返回字符串。
参数:
value:必选。通常为输入的对象,比如数组,类等。
replacer:可选。通常有两种方式,数组和方法。
(1) replacer为数组时,它和第一个参数有关。一般来说,系列化后的结果是通过键值对来表示。如果第二个参数的值在第一个参数中存在,那么就以第二个参数的值为key,第一个参数的值为value;如果不存在,那么第二个参数会被忽略,只是第一个参数被系列化。
(2)replacer为方法时,把系列化后的每一个对象传进方法里进行处理。
space:可选。添加缩进、空白和换行符,使JSON文本更便于阅读。
只有一个参数时:
var stuArrobj=[
{name: "张三", sex:1, age: 25},
{name: "李四", sex:0, age: 20},
{name: "王五", sex:1, age: 25}
];
var stuArrstr=JSON.stringify(stuArrobj);
console.log(stuArrstr);
输出:
[{"name":"张三","sex":1,"age":25},{"name":"李四","sex":0,"age":20},{"name":"王五","sex":1,"age":25}]
二个参数存在,并且第二个参数为方法时:
如果数据比较复杂,除了姓名,性别,年龄,还有头像,昵称,签名等信息,但只需要把用户名和性别保存在本地。
let stuArrobj=[
{name: "张三", sex:1, age: 25},
{name: "李四", sex:0, age: 20},
{name: "王五", sex:1, age: 25}
];
let stuArrstr=JSON.stringify(stuArrobj, ["name", "sex"]);
console.log(stuArrstr);
输出:
[{"name":"张三","sex":1},{"name":"李四","sex":0},{"name":"王五","sex":1}]
如果要把1,0修改为男女,那么第二个参数可以用回调函数来处理。
let stuArrobj=[
{name: "张三", sex:1, age: 25},
{name: "李四", sex:0, age: 20},
{name: "王五", sex:1, age: 25}
];
let stuArrstr=JSON.stringify(stuArrobj, function (k, v) {
if (k === "sex") {
return ["女", "男"][v];
}
return v;
});
console.log(stuArrstr);
输出:
[{"name":"张三","sex":"男","age":25},{"name":"李四","sex":"女","age":20},{"name":"王五","sex":"男","age":25}]
第二个参数存在,如果为数组时
1.第一个参数和第二个参数都是数组
var stuArr1=new Array();
stuArr1[0]="张三";
stuArr1[1]="李四";
stuArr1[2]="王五";
var stuArr2=new Array();
stuArr2[0]="1";
stuArr2[1]="2";
var stuArrstr=JSON.stringify(stuArr1,stuArr2);
console.log(stuArrstr); //第二个参数被忽略,只是第一个参数被系列化
输出:
["张三","李四","王五"]
2.第一个参数是对象,第二个参数是数组
var stuobj=new Object();
stuobj.name="张三";
stuobj.age="25";
var stuArr=new Array();
stuArr[0]="id"; //stuobj对象里不存在,忽略。
stuArr[1]="name";
var stuArrstr=JSON.stringify(stuobj,stuArr);
console.log(stuArrstr);
输出:
{"name":"张三"}
JSON.stringify()第三个参数的使用
如果省略第三个参数,那么显示出来的值没有分隔符。
var stuobj=new Object();
stuobj.name="张三";
stuobj.age="25";
var stuArrstr=JSON.stringify(stuobj);
console.log(stuArrstr);
输出:
{"name":"张三","age":"25"}
如果第三个参数是数字,则缩进几个字符。如果大于10,则默认为10,因为最大值为10。
var stuobj=new Object();
stuobj.name="张三";
stuobj.age="25";
var stuArrstr=JSON.stringify(stuobj,null,1000);
console.log(stuArrstr);
输出:
{
"name": "张三",
"age": "25"
}
如果第三个参数是转义字符,比如“\t”,表示回车,那么它每行一个回车。
var stuobj=new Object();
stuobj.name="张三";
stuobj.age="25";
var stuArrstr=JSON.stringify(stuobj,null,'\t');
console.log(stuArrstr);
运行结果如下:
{
"name": "张三",
"age": "25"
}
如果第三个参数是字符串,就在每行输出值的时候把该字符串附加上去,最大长度也是10个字符。
var stuobj=new Object();
stuobj.name="张三";
stuobj.age="25";
var stuArrstr=JSON.stringify(stuobj,null,'student');
console.log(stuArrstr);
运行结果如下:
{
student"name": "张三",
student"age": "25"
}