JSON格式是种用于数据交换的文本格式,目的是取代麻烦笨重的XML格式。
我这里有些数据,然后发送给服务器或者其他终端,然后对方就需要解析吧,关键是怎么解析呢?解析乱了呢?所以提前约定好一种数据写法,一种格式,然后解析就方便了。
以前是XML格式:
<people>
<name>haha</name>
<age>5<age>
</people>
比较像html的格式了,但是好麻烦哦。
JSON格式:
{
"name" : "haha",
"age": "5"
}
看着好像对象的格式哦,是吧。因为用着太舒服了,简单,所以推广了。但是,严格意义上,JSON格式不仅仅用在浏览器中的,它是一种数据格式,就是用在数据交互中的,所以用途比较广,比如脱离JS,用在服务器中,解析JSON格式数据,然后得到一个对象。
严格规定:
- 复合类型值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
- 简单类型值:数值(必须十进制内表示),字符串,布尔值和null,其他不行的。
- 字符串必须双引号。
- 对象键名key必须用双引号。
- 数组、对象最后一个成员后面,不能加逗号。
说这个的意思就是JS中的对象的写法是比较宽松自由的,加以区别哦。
合格的写法:
["one","two","three"]
{"one":1,"two":2,"three":3}
{"names":["张三","李四"]}
[{"name":"张三"},{"name":"李四"}]
错误的写法:
{name:"张",'age':32} //属性必须双引号
[32,64,234,0xFFF] //不能十六进制
{"name":"张","age":undefined} // 不能undefined
{"name":"张",
"birthday":new Date('Fir ,26 Aug 2011 07:13:17'),
"getName": function() {
return this.name
}} //不能日期和函数
空数组和空对象也是符合的,null也是符合的。
JSON.stringify()
这里要讲在JS 中处理JSON 格式的数据。
JSON.stringify用于将一个值转化为字符串。字符串符合JSON格式,并可以被JSON.parse方法还原。
var str = '{name : "haha", age: 3}' // 字符串,符合JSON格式
JSON.parse(str) //执行,得到了{age:3,name:"haha"}
JSON.parse(str).age // 3
JSON.parse(str).name //"haha"
字符串转JS数据。
现在要JS数据转成字符串:
var obj ={a:1,b:2}
JSON.stringify(obj) //"{"a":1,"b":2}"
简单数据的深拷贝
上次是用函数递归,先把参数进行遍历,在函数里重新生成空对象,遍历过程中再去赋值,return回来。
var obj = {
name : 'hunger',
age : 3,
friends : ['aa','bb','cc']
}
var obj2 = JSON.parse(JSON.stringify(obj)) //先变成字符串,再把字符串解析变成JS的对象
obj.age = 4
console.log(obj2.age) // 3
JS对象字面量写法长得像JSON格式数据,两者不同范畴。JS更宽泛,JSON更严谨。JS的函数,日期等格式不支持JSON规范。