JSON 数据详解及实例代码分析
JSON数据详解
一、json值的类型
1.简单值:可以表示字符串,数值,布尔值,null不支持undefined(json的数值表示:2)
2.对象:一组有序的键值对,每个键值对的值可以是简单值,也可以是复杂数据类型。(json的字符串:“helloworld”)。json字符串与JavaScript字符串的区别,json必须用双引号。
3.数组:一组有序值的列表,数组的值可以是简单值,也可以是复杂数据类型。
不支持变量,函数,以及对象实例
二、json对象与javascript对象
区别:
//javascript对象
varobj={
name:"liu",
age:33,
};
//json对象
{
"name":"liu",
"age":33,
}
- 没有声明变量(json中没有变量的说法)
- 没有末尾分号()
- json中属性也要加双引号
三、字符串与json对象转换
1、JSON.parse()。parse把字符串解析成原生javascript值(javascript对象);每个属性名都必须用双引号
varstr='{"name":"huangxiaojian","age":"23"}';
console.log(JSON.parse(str));//Object{name:"huangxiaojian",age:"23"}
接收另一个参数,为区别JSON.stringify()的过滤函数(过滤器),因而叫还原函数。如下:
varbook={
title:"hello",
author:["apple"],
year:300,
releaseDate:newDate(2016)
};
varjsonText=JSON.stringify(book)
varbookCopy=JSON.parse(jsonText,function(key,value){
if(key=="releaseDate"){
returnnewDate(value);
}else{
returnvalue;
}
});
console.log(bookCopy.releaseDate.getFullYear());
以上代码book对象,有个releaseDate属性,保存Date对象,经过序列化后变成有效的JSON数据字符串,然后经过解析又在bookCopy中还原为一个Date对象,当遇到releaseDate键值时,会基于相应的值创建一个新的Date对象,结果就是bookCopy.releaseDate属性中保存一个新的Date对象。
2、JSON.stringify(object,selector,retract)对象,过滤器(数组或函数),保留缩进。
JSON.stringify()把json对象序列化为字符串。(忽略函数、原型)
vara={a:1,b:2};
console.log(JSON.stringify(a));//{"a":1,"b":2}不包含任何空格字符或缩进
3、JSON.stringify()第二个参数,过滤器为数组
过滤器:可以使数组(如果是数组,就把数组中有的属性保留),也可以是函数(如果是函数,传两个参数:属性和属性值)。
varperson={
name:"liu",
age:33,
eat:["apple"],
sex:"man"
}
varjsonText=JSON.stringify(person,["eat","age"])
console.log(jsonText)//{"eat":["apple"],"age":33}
4、JSON.stringify()第二个参数为函数
函数:函数的两个参数()。switch中参数是属性名(必须字符串)。如果是undefined则忽略属性,(这个value参数是整个序列化后的对象)
特别注意,value在《javascript高级程序设计第三版》中表述和我的不同。可能是我的理解有问题,但是我测试了,结果也是序列化后的值。谁能解决了可以告诉我。(page:566~567)
varperson={
"name":"liu",
"age":33,
"eat":["apple"],
"sex":"man"
}
varjsonText=JSON.stringify(person,function(key,value){
//console.log(value)
switch("eat"){
case"eat":
return[3,4,5,5,5].join(",");
case"age":
return33;
case"sex":
returnundefined;
default:
returnvalue;
}
})
console.log(jsonText)//"3,4,5,5,5"
5、缩进,最大缩进为10。超过10会转换为10
varperson={
"name":"liu",
"age":33,
"eat":["apple"],
"sex":"man"
}
varjsonText=JSON.stringify(person,null,4)
console.log(jsonText)
/////////////////////////结果,带有格式////////////////////
{
"name":"liu",
"age":33,
"eat":[
"apple"
],
"sex":"man"
}
//特别的缩进方式
varjsonText=JSON.stringify(person,null,"---")
console.log(jsonText)
/////////////////////////结果,带有格式////////////////////
{
---"name":"liu",
---"age":33,
---"eat":[
------"apple"
---],
---"sex":"man"
}
6、toJSON()方法,返回自身的json数据格式。
vardate=newDate()
console.log(date.toJSON())
//person自身没有json数据格式,这是错的。
varperson={
"name":"liu",
"age":33,
"eat":["apple"],
"sex":"man"
}
console.log(person.toJSON())
7、为对象添加toJSON()方法,返回字符串则是字符串格式,对象则是对象格式,单个数值就是数值格式。
varperson={
"name":"liu",
"age":33,
"eat":["apple"],
"sex":"man",
"toJSON":function(){
returnthis.age
}
}
console.log(person.toJSON())//33
toJSON()可以做过滤器补充
8、假设一个对象传入JSON.stringify(),序列化该对象的顺序
- 存在toJSON()方法,且能获取有效值,则调用该方法,否则按默认顺序序列化。
- 如果提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值是第1步的返回值。
- 对第2步返回的每个值进行序列化。
- 如果提供了第三个参数,执行相应的格式化。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!