JavaScript JSON 格式操做

  關於JSON,最重要的是要理解它是一種數據格式,而不是一種編程語言。雖然具備相同的語法,但JSON並不從屬於JavaScript。並且,並非只有JavaScript才使用JSON,畢竟JSON只是一種數據格式。不少編程語言都有針對JSON的解析器和序列化器。javascript

  首先,說一下JSON的語法,JSON由三種類型組成,簡單、對象、數組。簡單值包括數值、字符串、布爾值、null。對象由一組鍵值對組成,其中能夠嵌套數組和對象。數組表示一組有序的值得列表,能夠包含數組和對象。java

console.log(JSON.parse(1))

  這樣寫是沒有錯的,能夠直接解析數值,可是這個沒有意義,通常實際運用中JSON都是以對象或數組的方式呈現。下面看看對象的表示法:編程

{
	"name" : "Miracle",
	"age" : 24
}

[1,2,"sd"]

  JSON的對象和數組與JavaScript的對象字面量和數組字面量很像,在JSON中全部的鍵都要用雙引號包裹,不然會致使語法錯誤。而字符串的值也必須使用雙引號包裹,不能使用單引號,由於會致使語法錯誤,在數組中也是同樣。在JSON中對象能夠包含數組,而一樣數組也能夠包含對象。數組

{
	"name" : "Miracle",
	"age" : 24,
	"skills" : ["AJAX", "ES5", "HTML5", "CSS3"],
	"friends" : [
		{
			"name" : "kirs",
			"age" : 23
		},
		{
			"name" : "HQ",
			"age" : 22
		}
	]
}

  上列代碼最外圍是一個對象,其中包含了2個簡單值,和兩個數組,而第二個數組"friends"中又包含了兩個對象。瀏覽器

  

  解析與序列化數據結構

  在JSON對象誕生以前,JSON的解析一直是使用eval()函數,使用eval()對JSON數據結構求值存在風險,由於可能會執行一些惡意代碼。ECMAScript 5對解析JSON的行爲進行了規範,定義了全局對象JSON。支持這個對象的瀏覽器有IE8+、Firefox 3.5+、Safari 4+、 Chrome 和Opera 10.5+。編程語言

  JSON對象有兩個方法:stringify()和parse()。stringify()用於將JSON對象的實例轉換爲JSON字符串,而JSON.parse()則將一個JSON字符串解析爲JSON對象。函數

var jobj = {
	"name" : "Miracle",
	"age" : 24
}

var jtext = JSON.stringify(jobj);

console.log(jtext);			//'{"name":"Miracle","age":24}'
console.log(typeof jtext);	//string

var obj = JSON.parse(jtext);
console.log(obj.name);		//"Miracle"

  在執行JSON.stringify()方法的時候對於JS中的特殊值好比undefined,function類型會忽略掉當前的鍵值對。對象

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"un" : undefined,
	"getName" : function(){
		alert(0);
	}
}

console.log(JSON.stringify(jobj)); //'{"name":"Miracle","age":24}'

  上述代碼中jobj對象中包含了一個鍵爲"un",它的值是undefined因爲JSON不識別這種基本類型,因此會將鍵和值所有忽略。JS中的funciton也是。blog

  JSON.stringify()方法一共有三個參數,第一個參數是要轉化的對象,這個參數是必選項,第二個參數是過濾設置,能夠是數組,也能夠是function。第三個參數是一個格式化的設置,能夠是字符串或者數值。注意這裏的過濾和格式化都是對對象的操做。

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"siklls" : ["AJAX", "ES5", "HTML5", "CSS3"]
}

console.log(JSON.stringify(jobj, ["name"])); //'{"name":"Miracle"}'

  若是JSON.stringify()方法的第二個參數是一個數組,那麼在執行的時候會匹配數組中的值與每一個鍵的名稱是否同樣,若是有返回這個鍵值對,沒有就忽略。若是一個都沒有最終返回空對象字符串"{}"。

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"siklls" : ["AJAX", "ES5", "HTML5", "CSS3"]
}

var s = JSON.stringify(jobj, function(key, val){
	if(key == "name"){
		return "who are you?";
	}else if(key == "siklls"){
		return undefined;
	}else {
		return val;
	}
});

console.log(s);		//{"name":"who are you?","age":24}

  若是JSON.stringify()第二個參數是函數,那麼根據函數返回的值來來匹配,若是函數自始至終都沒有返回,那麼結果就是undefined。這個函數接受兩個參數,當前的鍵和值,而後根據結果返回當前鍵和改變後的值。例如代碼中else if判斷中 結果返回了undefined ,前面說過了若是返回的不是JSON類型的數據,JSON會自動過濾。

  JSON.stringify()方法的最後一個參數是用來格式化字符串。改參數是一個字符串或者數值類型。若是是數值,則使用當前數值的空格數來縮進,若是是字符串則使用字符串來縮進,注意,這裏會自動換行。

 

var jobj = {
	"name" : "Miracle",
	"age" : 24,
	"siklls" : ["AJAX", "ES5", "HTML5", "CSS3"]
}

var s = JSON.stringify(jobj, null, 4);

console.log(s);	

 

上圖是使用Chromg 控制檯查看的結果。

相關文章
相關標籤/搜索