1. 什么式JSON?
JSON是存储和交换文本信息的语法,类似XML。
JSON比XML更小、更快,更易解析
JSON是轻量级的文本数据交换格式
JSON独立于语言(任何语言都可以使用JSON)
JSON具有自我描述,更易理解
JSON是在AJAX中代替XML交换数据的更佳方案*
2. JSON的语法
JSON是JavaScript对象表示语法的子集
JSON语法规则
- JSON数据在名称/值对中
- 花括号保存对象
- 方括号保存数组
JSON的值可以是:
数字(int、float)
字符串(在双引号中)
对象(在花括号中)
null
代码表示:
js中的对象表示:
var user={
name:"张三",
age:'30'
}
JSON对象表示:
{
"name":"张三",
"age":"30"
}
普通数组:
var arr=["aa",100,true]
JSON数组
["aaa",100,true]
数组对象嵌套使用:
[{
"name":"张三",
"age":"30"
},
{
"name":"张李四",
"age":"30"
},
{
"name":"王六子",
"age":"30"
}]
3. JSON的解析
一般情况json数据都是从服务端获取到的,获取的JSON都是以字符串的形式返回的,这个字符串虽然是JSON格式的,但是不能被直接使用,我们必须将该字符串转换伪一个对象才能正常的解析
- JavaScript 函数eval()可用于将JSON文本转换为Javascript对象
eval()函数可编译并执行任何JavaScript代码,存在一个潜在的安全性问题,(有恶意代码也会被执行) - 使用JSON解析器将JavaScript对象是更安全的做法,JSON解析器只会识别JSON文本,而不会执行。
JSON的解析:JSON数据转换为js对象
语法:var myJson=JSON.parse(myJSONtext,revier)
JSON的序列化:JS对象(字符串)转换为JSON数据
语法:var myJSONtext=JSON.stringify(myJson,relpacer)
实例:实际使用的时候JSON数据需要从服务器加载,
var jsonstr='[{
"name":"张三",
"age":"30"
},
{
"name":"张李四",
"age":"30"
},
{
"name":"王六子",
"age":"30"
}]';
alert(typeof (jsonstr))//string类型
解析无参数时:json数据转换为js对象
var jsonobj=JSON.parse(jsonstr)
alset(typeof (jsonobj))//object
访问:
alert(jsonobj[0].age)//30
有可选参数:
var jsonobj=JSON.parse(jsonstr,function(key,value){
if(key=='name'){
return 'VIP会员'+value
}else{
return value}
})
alert(jsonobj[0].name)//VIP会员张三
alert(jsonobj[0].age)//30
序列化:
var jsonobj=[
{
"name":'aaaa',
"age":"30",
"lv":"2"
},{
"name":'bbb',
"age":"30",
"lv":"2"
},{
"name:'ccc',
"age":"30",
"lv":"2"
}
]
alert(jsonobj[0].name)//aaaa
无可选参数:
var jsonstr=JSON.stringify(jsonobj)
alert(typeof(jsonstr))//obj
- 可选参数可以是数组,表示输出json对象中只包含数组中含有的属性
- 也可以是匿名函数
var jsonstr=JSON.stringify(jsonobj,['name'])
alert(jsonstr)//[{name:'aaaa'},{name:'bbb'},{name:'ccc'},]
var jsonstr=JSON.stringify(jsonobj,function(key,value){
if(key=='lv'){
return '等级为:'+value
}else{
return value
}
});
alert(jsonstr)//[{"name":'aaaa',"age":'30',"lv":'等级为:2'},{"name":'bbb',"age":'30',"lv":'等级为:2'},{"name:'ccc',"age":'30',"lv":'等级为:2'}
]
- 第三个参数表示缩进的字符数:
var jsonstr=JSON.stringify(jsonobj,null,4);
alert(jsonstr)
//结果为:
[
{
"name":'aaaa',
"age":"30",
"lv":"2"
},
{
"name":'bbb',
"age":"30",
"lv":"2"
},
{
"name:'ccc',
"age":"30",
"lv":"2"
}
]
JSON语法创建对象:
var people={
name:'张三',
age:30,
say:function(){
alert('我的名字是'+this.name);
}
}
alert(people.name)//张三
people.say()//我的名字是张三
定义一个坐标x:100,y:100,r:15的圆
var circle={x:100,y:100,r:15};
alert(circle.x,circle.y,circle.r)//100,100,15
嵌套JSON对象的定义(语法简单,不适用于创建多个对象):
var club={
VIP:1,
sex:'男',
user1:{
name:"张三",
job"工程师",
say:function(){
document.write(this.name+"职业是:"+this.job)}
},
user2:{
name:"李四",
job:"老师",
say:function(){
document.write(this.name+"职业是:"+this.job)}
}
}
club.user1.say()//张三职业是工程师
命名冲突的解决:
var a={
get:function(){
alert("我是A的方法")
}
}
var b={
get:function(){
alert("我是B的方法")
}
}
//调用的时候:
a.get()//
实例:JSON数据输出到表格中
(1)JSON数据的解析 (2)表格的动态输出
JSON数据:
var jsonstr='[
{"name":'aaaa',"age":'30',"lv":'等级为:2'
},{"name":'bbb',"age":'30',"lv":'等级为:2'
},{"name:'ccc',"age":'30',"lv":'等级为:2'}
]'
function textJson(){
var jsonobj=JSON.parse(jsonstr)
alert(jsonstr)
'[
{"name":'aaaa',"age":'30',"lv":'等级为:2'
},{"name":'bbb',"age":'30',"lv":'等级为:2'
},{"name:'ccc',"age":'30',"lv":'等级为:2'}
]
alert(jsonobj)[object,object],[object,object],[object,object]
}
function output(o){
document.write('<table><tr><th>key<th><th>value</th></tr>')
for(var i in o){
for(var j in o[i]){
document.write('<tr><td>'+j+'</td><td>'+o[i][j]+'</td></tr>')
}
}
}
document.write('</table>')
textJson();