开发人员觉得XML这种微型 的数据结构过于 烦琐 冗长,为了解决这个问题,JSON的结构化数据出现了。JSON是JavaScript的一个严格子集,利用Javascript中的一些模式来表示结构化数据 。
JSON和XML类型,都是一种结构化的数据表示方式 ,所以,JSON并不是JavaSript独有的数据格式 ,其他很多语言都可以对JSON进行解析和序列化.
JSON语法
JSON的语法 可以表示三种类型的值 :
1 简单值 :可以在JSON中表示字符串 数值 布尔值和null.但JSON不支持JavaScript中的特殊值undefined.
2对象:顾名思义。
3 数组:顾名思义。
简单值
100 "Lee"这两个量就是JSON的表示方法,一个是JSON数值 ,一个是JSON字符串。
对象
JavaScript对象字面量表示法:
var box = {
name:"Lee",
age:100
};
而JSON中的对象表示法需要加上双引号,并且不存在赋值运算和分号:
'{"name":"lee","age":100}'
{
"name":"lee",
"age":100
}
普通数组的表现方式
var box =[100,'lee',true];
JSON数组
[100,"lee",true]
// ps:JSON说白了就是一个字符串,所以任何表示,都应该加上引号表示字符串。
//PS JSON对象和数组比普通对象和数组,少了分号,少了变量赋值,而且本身应该是字符串表示。
//最常用的JSON结构
[
{
"titile":"a",
"num":1
},
{
"titile":"b",
"num":1
},
{
"titile":"c",
"num":1
}
]
一般情况下,我们可以把JSON结构数据保存到一个文本文件 里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串(XMLHttpRequest对象以后讲解)。所以 我们可以模拟这种中
模拟加载JSON文本文件的数据,并且赋值给变量。
var box='[{"name":"a","age":1},{"name":"b","age":2}]';
//PS 上面这段代码模拟了var box= load('demo.json')赋值过程 。因为通过load加载的文本文件 ,不管内容是什么 ,都必须是字符串。所以两边要加上双引号。
其实JSON就是比普通数组多了两国宾双引号
普通数组如下:
var box =[{name:'a',age:1},{name:'b',age:2}];
二 解析和序列化
如果是载入的JSON文件 ,我们需要对其进行使用,那么就必须对JSON字符串解析成原生的JavaScript值 。当然如果是原生的JavaScript对象或数组 ,也可以转换成JSON字符串。
对于讲JSON字符串解析成JavaScript原生值,早期采用的是eval()函数。但这种方法既不安全,可能会执行一些恶意代码 。因为通过load加载的文本文件
var json ='[{"name":"a","age":1},{"name":"b","age":1}]';
alert(box); //JSON字符串
var box = eval(json); //使用eval()函数解析
alert(box); //得到JavaScript原生值
alert(box[1].name); //a
ECMAScript5对解析JSON的行为进行规范,定义了全局对象JSON.
JSON对象提供了两个方法,一个是将原生JavaScript值转为JSON字符串:stringfify(),里面可以传三个参数 ,第二个参数起过滤做用,可以是数组 可以是函数,第三个参数是缩进;另一个是将JSON字符串转换为Javascript原生值 :parse().
var box ='[{"name":"a","age":1},{"name":"b","age":1}]';
alet(box);
var json=JSON.parse(box);
alert(json)
还有种过滤方式,使用toJSON()方法,可以将某一组对象 里指定返回某个值
var box = [{name:'a',age:1,toJSON:function(){
return this.name;
}},[{name:'b',age:1,toJSON:function(){
return this.name;
}}]
序列化也有执行顺序 ,首先执行toJSON()方法;如果应用 了第二个过滤参数,则执行这个方法;然后执行序列化过程 ,比如将键值对组成合法的JSON字符串,比发加上双引号。如果提供了缩进 ,再执行缩进操作。
网友评论