JSON数据
什么是JSON?
21世纪初,Douglas Crockford
寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML
,但是Douglas Crockford
觉得XML
的生成和解析都太麻烦,所以他提出了一种简化格式,也就是JSON
。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford
声称这个规格永远不必升级,因为该规定的都规定了。
- 并列的数据之间用逗号(", ")分隔。
- 映射用冒号(": ")表示。
- 并列数据的集合(数组)用方括号("[]")表示。
- 映射的集合(对象)用大括号("{}")表示。
注意
在json数据中规定属性名必须要加双引号,否则检验通不过。
[
{"城市":"北京","面积":16800,"人口":1600},
{"城市":"上海","面积":6400,"人口":1800}
]
数据集合既可以用数组表示,也可以用对象表示,那么我到底该用哪一种呢?
数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
比如在javascript中,可以这样定义一个对象:
var a={"城市":"北京","面积":16800,"人口":1600};
但是,也可以定义成一个关联数组:
a["城市"]="北京";
a["面积"]=16800;
a["人口"]=1600;
在Javascript语言中,关联数组就是对象,对象就是关联数组。这一点与php语言完全不同,在php中,关联数组也是数组。
比如运行下面这段javascript:
var a=[1,2,3,4];
a['foo']='Hello World';
alert(a.length);//4
最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:
<?php
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);//5
?>
最后的结果是5,也就是说,数组a的元素个数是5个。
JSON常用方法
JSON.stringify():JSON对象转化JSON字符串
var jsonObj = {"name":"Liza", "password":"123"};
var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr); //{"name":"Liza","password":"123"}
JSON.parse():JSON字符串转化JSON对象
var jsonStr = '{"name":"Liza","password":"123"}';
var jsonObj = JSON.parse(jsonStr);
console.log(jsonObj);
JSON的输出美化:
上一节讲到了将JSON转化为字符串可以用JSON.stringify() 方法,stringify还有个可选参数space,可以指定缩进用的空白字符串,用于美化输出(pretty-print)。
space参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数没有提供(或者为null)将没有空格。
美化前代码:
var jsonObj = {"name":"Liza", "password":"123"};
var jsonStr =JSON.stringify(jsonObj);console.log(jsonStr);
如下图:
美化后代码:
var jsonObj = {"name":"Liza", "password":"123"};
var jsonStr =JSON.stringify(jsonObj, undefined, 2);console.log(jsonStr);
如下图:
遍历JSON
- 遍历JSON对象代码如下:
var packJson = {"name":"Liza", "password":"123"} ;
//遍历packJson 对象的每个key/value对,k为key
for(var k in packJson ){
console.log(k + " " + packJson[k]);
}
- 遍历JSON数组代码如下:
var packJson = [{"name":"Liza", "password":"123"}, {"name":"Mike", "password":"456"}];
//遍历packJson 数组时,i为索引
for(var i in packJson){
console.log(packJson[i].name + " " + packJson[i].password);
}