注意,JSON只是一种格式,而不是对象,不存在JSON对象。JSON只有字符串形式,就是我们常说的JSON字符串:key/value值和数组形式的字符串。只能说有JSON格式的JS对象,JSON格式的字符串,JSON格式的数组。当JSON字符串转换为Java对象是就是Java对象,当JSON字符串被转换为JS对象时,就是JS对象。因为JSON格式和JS对象的语法相似(JS对象的键可以加引号也可以不加引号,JSON格式的键必须加双引号),所以我们有时候误以为了JSON就是JS对象。
html页面:
<html>
<head>
<title>Title</title>
<meta charset="UTF-8" content="text/html" >
<script>
//假如给出的是这种形式,province已经是一个JSON格式的js对象,不需要解析
var province={
"name":"浙江",
"cityCount":3,
"cities":[{
"name":"宁波",
"id":1
},{
"name":"杭州",
"id":2
}
]
}
print1(province)
console.log("****************************")
//从服务器接收得到的一般是字符串,它只是JSON格式的字符串所以需要用eval()或JSON.parse()将其转换为JS对象
var str="{\"name\":\"浙江\",\"cityCount\":2,\"cities\":[{\"name\":\"宁波\",\"id\":1},{\"name\":\"杭州\",\"id\":2}]}";
//1.用eval()解析
var strObj=eval("("+str+")");
print2(strObj)
console.log("************************")
//2.用JSON.parse()解析
var strObj1=JSON.parse(str);
print2(strObj1)
//第一种遍历方法,传统for循环
function print1(obj) {
console.log(obj.name,obj.cityCount);
for (var i=0;i<obj.cities.length;i++){
console.log(obj.cities[i].name,obj.cities[i].id)
}
}
//也可以用第二种遍历方法,for in
function print2(obj) {
for(var x in obj){
if(!(obj[x] instanceof Array)){
console.log(x,obj[x])
}else {
for (var i in obj[x]){
for (var m in obj[x][i]) {
console.log(m, obj[x][i][m]);
}
}
}
}
}
</script>
</head>
<body>
</body>
</html>
运行结果:
思考:JSON.parse()和eval()的区别?
JavaScipt中提供的文本转换为JSON对象的函数只有eval(),JSON.parse()其实是对eval()函数的封装。如果使用eval()转换文本需要在括号中添加“()”声明。另外,如果文本中包含程序代码,eval()会直接将其执行,所以安全性较差。而JSON.parse()会用正则表达式验证所给的文本是否有程序代码,若有,则会抛出异常,操作更安全。