一、JSON的解析方法有两种:eval()和JSON.parse()
var jsonstr='{"str1":"Hello,", "str2":"world!"}'; var evalJson=eval('('+jsonstr+')'); var jsonParseJson=JSON.parse(jsonstr);
这样就把jsonstr这个json格式的字符串转换成了JSON对象。
二者的区别在于:JSON.parse()可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,而eval()可以解析任何字符串,eval()会执行字符串的代码,造成原先字符串的值改变,是不安全的。
二、JSON.parse(text [, reviver])语法
1、参数
text:必选。一个有效的 JSON 字符串。
reviver:可选。一个转换结果的函数,将为对象的每个成员调用此函数。
2、功能
JSON.parse(jsonstr)将格式完好的json字符串转换为json对象。所谓"格式完好",就是要求jsonstr必须符合严格的JSON格式,例如:属性名称必须用双引号,字符串值也必须用双引号括起来,单引号写在{}外。
3、实例
var jsonstr='{"str1":"abc", "str2":"123"}'; var jsonobj=JSON.parse(jsonstr); console.log(jsonobj); 运行结果如下: Object str1: "abc" str2: "123" __proto__: Object
三、JSON.stringify(value [, replacer] [, space])语法
1、参数
value:必选。通常为输入的对象,比如数组,类等。
replacer:可选。通常有两种方式,数组和方法。
(1) replacer为数组时,它和第一个参数有关。一般来说,系列化后的结果是通过键值对来表示。如果第二个参数的值在第一个参数中存在,那么就以第二个参数的值为key,第一个参数的值为value;如果不存在,那么第二个参数会被忽略,只是第一个参数被系列化。
(2) replacer为方法时,把系列化后的每一个对象传进方法里进行处理。
space:可选。添加缩进、空白和换行符,使JSON文本更便于阅读。
2、功能
JSON.stringify(jsonobj)将json对象转换为json字符串。
3、实例
(1)JSON.stringify()只有第一个参数时
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}]
(2)JSON.stringify()第二个参数存在,并且为方法时
如果数据比较复杂,除了姓名,性别,年龄,还有头像,昵称,签名等信息,但只需要把用户名和性别保存在本地,有两种实现方式。
A遍历数据,重新提取
var stuArrobj=[ {name: "张三", sex:1, age: 25}, {name: "李四", sex:0, age: 20}, {name: "王五", sex:1, age: 25} ]; for (var i=0, newArr=[]; i<stuArrobj.length; i++) { newArr.push({ name: stuArrobj[i].name, sex: stuArrobj[i].sex }); } var stuArrstr=JSON.stringify(newArr); console.log(stuArrstr); 运行结果如下: [{"name":"张三","sex":1},{"name":"李四","sex":0},{"name":"王五","sex":1}]
B用JSON.stringify()的第二个参数
var stuArrobj=[ {name: "张三", sex:1, age: 25}, {name: "李四", sex:0, age: 20}, {name: "王五", sex:1, age: 25} ]; var stuArrstr=JSON.stringify(stuArrobj, ["name", "sex"]); console.log(stuArrstr); 运行结果如下: [{"name":"张三","sex":1},{"name":"李四","sex":0},{"name":"王五","sex":1}]
如果要把1,0修改为男女,那么第二个参数可以用回调函数来处理。
var stuArrobj=[ {name: "张三", sex:1, age: 25}, {name: "李四", sex:0, age: 20}, {name: "王五", sex:1, age: 25} ]; var 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}]
(3)JSON.stringify()第二个参数存在,并且为数组时
A第一个参数和第二个参数都是数组
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); //第二个参数被忽略,只是第一个参数被系列化 运行结果如下: ["张三","李四","王五"]
B第一个参数是对象,第二个参数是数组
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":"张三"}
(4)JSON.stringify()第三个参数的使用
A如果省略第三个参数,那么显示出来的值没有分隔符。
var stuobj=new Object(); stuobj.name="张三"; stuobj.age="25"; var stuArrstr=JSON.stringify(stuobj); console.log(stuArrstr); 运行结果如下: {"name":"张三","age":"25"}
B如果第三个参数是数字,则缩进几个字符。如果大于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" }
C如果第三个参数是转义字符,比如“\t”,表示回车,那么它每行一个回车。
var stuobj=new Object(); stuobj.name="张三"; stuobj.age="25"; var stuArrstr=JSON.stringify(stuobj,null,'\t'); console.log(stuArrstr); 运行结果如下: { "name": "张三", "age": "25" }
D如果第三个参数是字符串,就在每行输出值的时候把该字符串附加上去,最大长度也是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" }
4、限制
IE6,7,8不能使用JSON.stringify(),可以用json2.js将json对象转换为json字符串。
<!--[if lt IE 9]> <script src="json2.js"></script> <![endif]-->
四、综合应用
var arr=["a", "b", "c"]; var str=JSON.stringify(arr); //将数组转换为字符串 var newArr=JSON.parse(str); //将字符串转换为数组
输出“键-值”字符串
var resultObj =[ { qid:0,//表示题目编号,取值0-5 aid:1 //表示答案选项编号,有ABCD,对应0123 }, { qid:1, aid:2 }, { qid:2, aid:0 }, { qid:3, aid:3 }, { qid:4, aid:1 }, { qid:5, aid:0 } ] var str = JSON.stringify(resultObj); console.log(str); //[{"qid":0,"aid":1},{"qid":1,"aid":2},{"qid":2,"aid":0},{"qid":3,"aid":3},{"qid":4,"aid":1},{"qid":5,"aid":0}]
输出“值-值”字符串
var resultObj = {}; var arr = [1,2,0,3,1,0]; for(var i=0; i<arr.length; i++){ resultObj[i] = arr[i]; } var str = JSON.stringify(resultObj); console.log(str); //{"0":1,"1":2,"2":0,"3":3,"4":1,"5":0}
五、从console面板看数组和字符串的区别
var arr=["a", "b", "c"]; var str=JSON.stringify(arr); console.log(arr); alert('arr是一个数组,打印出来是:'+arr);
var arr=["a", "b", "c"]; var str=JSON.stringify(arr); console.log(str); alert('数组变成数组字符串:'+str);