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

  1. 遍历JSON对象代码如下:
var packJson  = {"name":"Liza", "password":"123"} ;

//遍历packJson 对象的每个key/value对,k为key
for(var k in packJson ){
   console.log(k + " " + packJson[k]);
}
  1. 遍历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);  
}