来自https://www.cnblogs.com/gaojun/p/3394274.html,感谢作者的无私分享。
早期,一般是使用XML作为互联网上传输结构化数据的,但由于它解析麻烦,字符冗长,因此被轻量级的JSON所逐渐替代。JSON是JavaScript的一个严格子集,利用了JavaScript中一些模式来表示结构化的数据。可以直接将JSON格式的字符串传递给eval()进行处理,由于JSON是JS的子集,eval后变成json对象,可以使用’.’操作符直接操作属性;
值得注意:JSON是一种数据格式,不是一种语言,虽然与JS中定义对象字面量的形式相似,但JSON不从属于JavaScript,因为其它语言(如:PHP,JSP)中也有针对JSON的解析和序列化的方法操作。
语法
JSON可以表示以下三种值:
- 简单值:如字符串、数值、布尔值和null,但不支持undefined
- 对象:对象作为一种复杂的数据类型,表示是一组无序的键值对儿,值可以是简单值也可以复杂的数据
- 数组:数组作为一种复杂的数据类型,表示是一组有序的列表儿,可以通过索引来获取引用的值,值可以是简单值,也可以复杂数据对象
一个简单的JSON示例:
{ "name": "Jack", "age": 30, "isMan": true, "school": { "name": "Lonton University", "location": "English" } }
非常重要:JSON对象的属性(如上例中的“name”)必须加双引号。
在实际使用中,经常会因为上面使用单引号或不使用引号造成序死化错误,从而无法生成JSON对象
序列化
JSON被大家所认可,除了语法是JavaScript语法子集,更主要是可以直接eval序列化(但有一定风险,可能会执行一些恶意代码,如读cookie等)成可用的JS对象直接使用。ECMAScript 5对解析JSON进行规范,定义了全局对象JSON,支持的浏览器有:IE8+,Firefox 3.5+,Safari4+,Chrome和Opera 10.5+;
JSON对象提供两个方法:stringify()和parse(),stringify()是将JSON对象转成字符串,而parse()则是将符合规范的字符串转成可用JSON对象。
stringify()
JSON.stringify(value [, replacer] [, space])
value:JSON对象。
replacer:过滤器(可选的),可以是方法或数组,用于过滤操作,如果是数组,则序列化字符串只包含数组中指定的值的JSON属性及属性值,如果是方法,方法传递key,value,可以对JSON对象每一个属性值及值进行处理后返回。
space:是否保留缩进,默认不保留,并且删除所有换行。
1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来
2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10.
3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。
4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。
实例:
var student = new Object(); student.name = "Lanny"; student.age = "25"; student.location = "China"; var json = JSON.stringify(student); alert(json); //{"name":"Lanny","age":"25","location":"China"}
使用数组过滤,只保留:name及locaiton
var json = JSON.stringify(student,["name","location"]); alert(json);//{"name":"Lanny","location":"China"}
使用函数过滤,对于name属性值单独处理,在之前输出:”my name is :”
var json = JSON.stringify(student, function (key, value) { switch (key){ case "name": return "my name is " + value; default : return value; } }); alert(json);//{"name":"my name is Lanny","age":"25","location":"China"}
使用缩进,缩进4个空白:
var json = JSON.stringify(student,null,4);alert(json);//返回结果如下:{"name": "Lanny","age": "25","location": "China"}
parse()
JSON.parse(text [, reviver])
参数
text :必需。 一个有效的 JSON 字符串。
reviver :可选。 一个转换结果的函数。 将为对象的每个成员调用此函数。 如果成员包含嵌套对象,则先于父对象转换嵌套对象。 对于每个成员,会发生以下情况:
-
如果 reviver 返回一个有效值,则成员值将替换为转换后的值。
如果 reviver 返回它接收的相同值,则不修改成员值。
-
如果 reviver 返回 null 或 undefined,则删除成员。
返回值:一个对象或数组
示例:
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext);
以下示例演示了如何使用 JSON.stringify 将数组转换成 JSON 字符串,然后使用 JSON.parse 将该字符串还原成数组。
var arr = ["a", "b", "c"]; var str = JSON.stringify(arr); document.write(str); document.write ("<br/>"); var newArr = JSON.parse(str); while (newArr.length > 0) { document.write(newArr.pop() + "<br/>"); } // Output: var arr = ["a", "b", "c"]; var str = JSON.stringify(arr); document.write(str); document.write ("<br/>"); var newArr = JSON.parse(str); while (newArr.length > 0) { document.write(newArr.pop() + "<br/>"); } // Output: ["a","b","c"] c b a
json的语法可以表示以下三种类型的值。
1、简单值:可以在json中表示字符串、数值、布尔和null。
2、对象:对象作为一种复杂的数据类型,表示一组有序的键值对儿。
3、数组:数组也是一种复杂的数据类型,表示一组有序的值列表,可以通过数值索引来访问其中的值。
json不支持变量、函数或对象实例,它就是一种表示结构化数据的格式。
1.1:简单值:
如下10,“aa”,json字符串与js字符串最大的区别是json字符串必须使用双引号布尔与null也是有效的json形式。
2.1:对象
对象字面量一般写法是:
1
2
3
4
5
6
|
var
aa ={
name:
"zoumm"
,
job :
"it"
,
age :25
};
|
json对象一般这样写的:
{ "name":"zoumm", "job":"it", "age":23, "school":{ "name":"大学名", “add”:"中国" } }
他们的区别是,json对象不用定义变量,末尾不用写分号,切所有的属性名必须加双引号;
3.1:数组
一般数组是这样定义的:
var aa = [23,"zoumm"];
json数组是这样定义的
[ 23,"zoumm" ]
他们的区别是,json数组不用定义变量,末尾不用写分号;
在Jquery中实现ajax用post请求后台json数据时,返回了一个html,而不是想要的Json数据,这个问题郁闷了一上午,在网上查的方法一没用。最后终于发现是因为在service方法中引用了“super.service();” 这句话。去掉就解决了。
下面进入正题:js中如何操作json数据。
一、要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组。
1、对象 一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:”;“‘名称/值’ 对”之间使用“,”分隔。 名称用引号括起来;值如果是字符串则必须用括号,数值型则不需要。例如: var jsonObj={"str":"abc","intstr":1322323456,"max":6753,"time":"2012-10-19"};
2. 数组是值(value)的有序集合。一个数组以“[” 开始,“]”结束。值之间运用 “,”分隔。
例如:var jsonList=[{"str":"abc","intstr":1322323456,"max":6753,"time":"2012-10-19"}, {"str":"cde","intstr":782144556,"max":15400,"time":"2012-10-19"}];
二、JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。json在传输过程中是以文本形式存在的,即字符串的形式。而在JS中需要操作的是对象,所以需要把json转换成对象,一般用“eval()”函数来实现,例如 :var obj = eval('(' + json+ ')'); 这样就可以随意操作json了。
三、如果不知道jsonlist对象里的key和value怎样来获得其中的数据?
for(var i=0;i<jsonList.length;i++){
for(var key in jsonList[i]){
alert("key:"+key+",value:"+jsonList[i][key]);
}
}
用这种方法就可以解析json数据了。
json解析与序列化
1:json对象
json对象有两个方法stringify和parse,他们分别是把js对象序列化成json字符串,和把json字符串解析成原生js值,例如:
var aa ={ name:"zoumm", age:23 }; var bb = JSON.stringify(aa); console.log(bb); //打印出{"name":"zoumm","age":23}
在序列化js对象时,所有函数与原型成员都会有意忽略,不体现在结果中,此外,值为undeined的任何属性也会被跳过。例如:
var aa1 ={ name:"zj", age:25, tmp:undefined, say:function(){ console.log(1); } }; var bb1 = JSON.stringify(aa1); console.log(bb1); //打印{"name":"zj","age":25}
}
将json字符串传递给json.parse,就得到js的值,如下:
var cc = JSON.parse(bb1); console.log(cc );//打印Object {name: "zj", age: 25}
虽然cc与aa1有相同的属性,但是他们是独立的,没有任何关系的对象
2:序列化选项
JSON.stringify()还接受两个参数,这两个参数用于指定不同方式序列化js对象,第一个参数可以是对象也可以使函数,第二个是一个选项,表示是否在json字符串中保留 缩进,
var book = { name :"zoumm", age :23, job :"it" } var text = JSON.stringify(book,["name","job"]);//两个参数,参数一:函数或者数组,参数二,截取的数据 console.log(text)//打印 {"name":"zoumm","job":"it"}