關於JSON的那些事兒


JSON的那些事兒

 

曾經有一段時間,XML是互聯網上傳輸結構化數據的事實標准,其突出特點是服務器與服務器間的通信。但是業內不少人認為XML過於繁瑣、冗長,后面為了解決這個問題也出現了一些方案,但是由於其結構很嚴格,這些問題還是不能從根本上得到解決。隨着Web的不斷發展,慢慢的出現了一種輕量級的數據格式——JSON,它的出現受到很多編程人員的喜愛,這篇文章主要講關於JSON的那些事。

  (注:這邊文章主要討論的是javascript中的JSON操作,故很多東西只是針對Javascript來說)

【JSON的歷史

  JSON的全稱:JavaScript Object Notation,翻譯過來的意思是Javascript對象表示法。它基於JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一個子集,作為一種輕量級的數據交換格式,JSON早在2000年前就已經在使用了。2006Douglas CrockfordJSON提交給IETF后,JSON開始作為Javascript的一個嚴格的子集,它用Javascript中的一些模式來表示結構化數據。而在Javascript中,JSON無疑是更好的讀寫結構化數據的方式。

JSON的特點】

  1、JSON是一種輕量級的數據交換格式(不是一種編程語言);

  2、JSON是存儲和交換文本信息的語法,類似於XML,采用鍵值對的方式來組織,從而易於閱讀和編寫,同時也易於機器解析和生成;

  3、JSON采用與編程語言無關的文本格式,但是也使用了類C語言(包括CC++C#JavaJavaScript,PerlPython等)的習慣,這些特性使JSON成為理想的數據交換格式(獨立於語言,很多編程語言都能解析JSON,只要按JSON的規則就行了);

  4、JSON可以用Javascript內建的方法直接進行解析,從而轉換成Javascript也非常方便

JSON的優點】

  1、基於純文本,跨平台傳遞極其簡單;

  2、Javascript原生支持,后台語言幾乎全部支持;

  3、輕量級數據格式,占用 字符數量極少,特別適合互聯網傳遞;

  4、可讀性較強,雖然比不上XML那么一目了然,但在合理的依次縮進之后還是很容易識別的;

  5、容易編寫和解析,當然前提是你要知道數據結構。

JSON的語法】

  JSON的語法可以表示以下三種類型的值:

    *對象:與Javascript類似(后面會有詳細介紹)。

    *數組:與Javascript類似(后面會有詳細介紹)。

    *簡單值:使用與Javascript相同的語法,可以在JSON中表示字符串、數值、布爾值和null,但是JSON不支持undefined

  [對象]

    規則:對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。

    圖像表示,如圖:

    示例:{"name":"foodoir","age":21}

    與Javascript的比較:

      在Javascript中的寫法(對象的面向字面量寫法):var obj = {"name":"foodoir","age":21};或是var obj = {name:"foodoir",age:21};

    與Javascript的區別:

      1、JSON中沒有變量聲明(JSON中沒有變量這個概念);

      2、JSON中沒有末尾的分號;

      3、JSON的屬性上面要加雙引號,而Javascript中可加可不加;

    注意事項:

      1、同一個對象中絕對不應該出現兩個同名屬性(父對象和子對象中的屬性可以同名)!

      2、屬性的值可以是簡單的值,也可以是復雜的值(比如說在對象中嵌入對象)!

      3、最后一個屬性的后面不應有逗號,否則會報錯!

      4、復雜的值可以是數字、字符串、布爾值、對象、數組和null(沒有undefined和函數)

    代碼示例:

{
    "name": 'foodoir',
    "age": 21,
    "school":{
    	"name":"XXX College",
    	"location":"Hunan"
    }
    //屬性的值可以是復雜的類型
}
//雖然說有兩個name,但是它們分別在不同的對象中

/*比較最后多一個逗號的效果*/
{
    "name": 'foodoir',
    "age": 21, //注意,這里多了一個逗號
}
//在JSON中直接導致語法錯誤

var obj = {
    "name": 'foodoir',
    "age": 21, //注意,這里多了一個逗號
};
//在標准瀏覽器、IE8+ 中,都能正常的執行,但在IE6、7中,卻會報錯

     

  [數組]

    規則:數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。

    圖像表示,如圖:

    示例:["foodoir",21,true]

    與Javascript的比較:

      在Javascript中的寫法(數組的面向字面量寫法):var arr = ["foodoir",21,true];

    與Javascript的區別:

      JSON中的數組和Javascript中的數組基本一致

    注意事項:

      1、數組可以和對象結合起來,構成更復雜的數據集合

      2、在JSON中最后一個屬性的后面不應有逗號,否則會報錯!

      3、數組中間可以是數字、字符串、布爾值、對象、數組和null(沒有undefined和函數)

     代碼示例:

[
	{
		"title":"HTML",
		"authors":{
			"foodoir.H"
			},
		"year":2001
	}
	{
		"title":"CSS",
		"authors":{
			"foodoir.C"
			},
		"year":2002
	}
	{
		"title":"JAVASCRIPT",
		"authors":{
			"foodoir.J"
			},
		"year":2003
	}
]
//多個數組和對象的結合,形成了更復雜的數據集合


['sheep', 'cat', 'dog',]//多了一個逗號
//在JSON中直接導致語法錯誤
var animal = ['sheep', 'cat', 'dog',];//同樣多了一個逗號
//在瀏覽器中不會報錯,但是,確會有個很嚴重的問題。IE6、7、8中會認為animal.length等於4,其中的元素為 'sheep', 'cat', 'dog', undefined

 

  [簡單值]

    規則:值(value)可以是雙引號括起來的字符串(string)、數值(number)、布爾值(true/false)、 null、對象(object)或者數組(array),只能是這七種類型。這些結構可以嵌套。

    圖像表示,如圖:

    示例:"foodoir" 25 true false null {"name":"foodoir"} [1,2,3]

    與Javascript的比較:

      與Javascript中的寫法基本一致

    與Javascript的區別:

      (略……)

    注意事項:

      1、JSON不支持Javascript中特殊的值undefined

      2、JSON也不支持Javascript中的function

  對於簡單值中間的字符串(string)和數值(number)有必要拿出來單獨提一提。

 

  [字符串]

    規則:字符串(string)是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。

    圖像表示,如圖:

    示例:{"string":"true \" false"}

    與Javascript的比較:

      在Javascript中的正則表達式(RegExp)比較相似

    注意事項:

      1、英文雙引號括起來,不能用單引號,也不能沒有;

      2、字符串中不能單獨出現雙引號(”) 和右斜杠(“\”);

      3、如果要打雙引號或右斜杠,需要使用“右斜杠+字符”的形式,例如 \” 和 \\其它轉移字符也是如此

      4、支持任何UNICODE字符。

    在這里,推薦一個比較好用的檢驗JSON格式的網址:http://www.json.cn

    我們可以在線檢驗我們的JSON,並且在右邊區域會有相應的錯誤的提示。這樣更方便我們對於JSON的使用。

  [數字]

    規則:數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。

    圖像表示,如圖:

    示例:1 2.01 -200 3e4 3e-4

    與Javascript的比較:

      JSON中不支持八進制和十六進制格式,而在Javascript中能很好的支持。

    注意事項:

      八進制和十六進制

    同樣,我們也可以用之前的工具來檢測我們的JSON代碼。

 

 

 

 到這里,JSON的基本語法都講的差不多了,后面我們將繼續介紹字符串和對象間的轉化、JSON和XML的轉換、Ajax和JSON、以及GeoJSON和TopoJSON。

--------------------------------------------------分界線--------------------------------------------------------------------

 如果你想了解更多關於JSON的,請繼續往下看

 

【字符串和對象間的轉換】

 

[ 解析 ]

 

  將符合 JSON 語法規則的字符串轉換成對象的過程叫做解析

  不同的編程語言都提供了解析 JSON 字符串的方法,在這里主要講解 JavaScript 中的解析方法。主要有三種:

    - 使用 eval()

    - 使用 JSON.parse()

    - 使用第三方庫,例如 JQuery

  下面我們來依次介紹這三種方法:

一、eval()的使用

  a) 在Javascript中,eval() 函數的參數是一個字符串,其作用是直接執行其中的 JavaScript 代碼

  b) eval() 能夠解析 JSON 字符串(從這里也可以看得出,JSON JavaScript 是高度嵌合的

  示例如下:

/*Javascript*/
var str = "console.log('hello world')";
eval(str);//hello world
//從這里可以看出,eval函數會直接對里面的代碼執行操作

/*JSON*/
var str = '{"name": "foodoir", "age": 21}';
var result = eval ("(" + str + ")");
console.log(result);//Object age : 21 name : "foodoir"

var str = '{"name": "console.log('foodoir')", "age": 21}';
var result = eval ("(" + str + ")");
console.log(result);// Uncaught SyntaxError: Unexpected identifier
//從這里可以看出,eval函數會直接對里面的代碼執行操作

  注意:

    1、eval() 雖然能夠解析 JSON 字符串,但是現在已經很少直接使用 eval() 來解析了,如果您的瀏覽器版本真的是很舊,可能才需要這個方法。此外,eval() 是一個相對危險的函數,因為字符串中可能含有未知因素。

    2、注意 eval() 的參數,在字符串兩旁加了括號,這是必須的,否則會報錯(原因:因為 JSON 字符串是被大括號(“{}”)包圍的,直接放到 eval() 會被當成語句塊)

二、JSON.parse()的使用 

  a) JSON.parse() 可以有第二個參數,是一個函數。此函數有兩個參數:name value,分別代表名稱和值。當傳入一個 JSON 字符串后,JSON 的每一組名稱/值對都要調用此函數。該函數有返回值,返回值將賦值給當前的名稱(name)。

  b) 利用第二個參數,可以在解析 JSON 字符串的同時對數據進行一些處理

 

  示例如下:

var str = '{"name": "foodoir", "age": 21}';
var obj = JSON.parse(str, fun);
function fun(name, value){	
	if( name == "age" )
		value = 14;
	return value;
}
console.log(obj);//Object {name: "foodoir", age: 14}

 

   注意:

    1、現在絕大多數瀏覽器都以支持 JSON.parse(),是推薦使用的方式;

    2、如果輸入了不符合規范的字符串,會報錯(建議配合之前的在線測試工具一起使用)

  補充:

    為了區別JSON.stringify()接收的替換(過濾)函數,在這里出現了一種還原函數(接收兩個參數,一個鍵和一個值,並且返回一個值)。如果還原函數返回undefined,則表示要從結果中刪除相應的鍵;如果返回其他值,則將該值插入到結果中。代碼示例如下:

var book = {
		"title":"HTML",
		"authors":[
			"foodoir.H"
			],
		year:2001,
		releaseDate:new Date(2016,9,22)//先為book對象增加一個releaseDate屬性,該屬性保存着Date對象
};

var jsonText = JSON.stringify(book);//經過序列化后變成有效的JSON字符串

var bookCopy = JSON.parse(jsonText,function(key,value){//在bookCopy中將JSON字符串解析為Date對象
	if(key == "releaseDate"){
		return new Date(value);
	}else{
		return value;
	}
});
//結果就是bookCopy.releaseDate屬性中保存了一個Date對象,然后后面才能基於Date對象調用getFullYear方法
alert(bookCopy.releaseDate.getFullYear());

   綜合練習:

var json = '{"staff":[{"name":"foodoir","age":21},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = eval('('+json+')');
alert(jsonobj.staff[0].name);//foodoir

var jsondata = '{"staff":[{"name":"foodoir","age":21},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = JSON.parse(jsondata);
alert(jsonobj.staff[0].name);//foodoir

var json = '{"staff":[{"name":"foodoir","age":alert(123)},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = eval('('+json+')');
alert(jsonobj.staff[0].name);//先是123		后是foodoir
//eval不會管json里面是否合法,並且會執行里面的方法

var jsondata = '{"staff":[{"name":"foodoir","age":alert(123)},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = JSON.parse(jsondata);
alert(jsonobj.staff[0].name);//報錯

三、第三方庫,例如 JQuery

    在這里不做介紹,后面會有專門的博文關於jquery處理JSON的介紹。

 

[ 序列化 ]

 

  序列化,指將 JavaScript 值轉化為 JSON 字符串的過程。

  JSON.stringify() 能夠將 JavaScript 值轉換成 JSON 字符串。JSON.stringify() 生成的字符串可以用 JSON.parse() 再還原成 JavaScript 值。

  表示方法:

    JSON.stringify(value[, replacer[, space]])

  參數的含義:

    value:必選參數。被變換的 JavaScript 值,一般是對象或數組。

    replacer:可以省略。有兩種選擇:函數或數組。

        - 如果是函數,則每一組名稱/值對都會調用此函數,該函數返回一個值,作為名稱的值變換到結果字符串中,如果返回 undefined,則該成員被忽略。

        - 如果是數組,則只有數組中存在名稱才能夠被轉換,且轉換后順序與數組中的值保持一致。

    space:可以省略。這是為了排版、方便閱讀而存在的。可以在 JSON 字符串中添加空白或制表符等。

  代碼示例:

var obj = {
	name:"foodoir",
	age:21,
	t:true,
	f:false,
	n:null,
	u:undefined,
	f:function(){
		return 1;
	},
	arr:[function(){}]
};
console.log(obj);

var jsonstr = JSON.stringify(obj);
console.log(jsonstr);

 

  結果顯示:

  當傳入的參數不同時,所控制的結果也會不同,下面我們介紹兩種在不同參數的情況下結果存在的變化。

  1過濾結果

    如果過濾器參數是數組,那么JSON.stringify()的結果中將只包含數組中列出的屬性;如果第二個參數是函數,行為會稍有不同,下面我們直接看下面的例子:

var book = {
		"title":"Javascript",
		"authors":[
			"foodoir JavaScript"
			],
		edition:3,
		year:2001
};

var jsonText1 = JSON.stringify(book,["title","edition"]);
console.log(jsonText1);//{"title":"Javascript","edition":3}
//結果分析:數組中只包含兩個字符串:"title"和"edition",故在結果中序列化的對象中的屬性是對應的

var jsonText2 = JSON.stringify(book,function(key,value){
	switch(key){
		case "authors":
			return value.join(",");//返回值將數組連接為字符串
		case "year":
			return 5000;//返回值為5000
		case "edition":
			return undefined;//返回值為undefined,直接跳過
		default:
			return value;//
	}
});
console.log(jsonText2);//{"title":"Javascript","authors":"foodoir JavaScript","year":5000}
//結果分析:在這里,函數過濾器根據傳入的鍵來決定結果,比如鍵為"year",其返回值為5000

 

 

 

  2 字符串縮進

    JSON.stringify()方法的第三個參數用於控制結果中的縮進和空白符。如果這個參數是一個數值,那它表示的是每個級別縮進的空格數,當然,我們還可以制表符或者短划線來控制縮進。我們直接看下面的例子:

var book = {
		"title":"Javascript",
		"authors":[
			"foodoir JavaScript"
			],
		edition:3,
		year:2001
};

var jsonText1 = JSON.stringify(book,null,4);
console.log(jsonText1);

var jsonText2 = JSON.stringify(book,null,"------");
console.log(jsonText2);

 

   結果顯示:

  注意:縮進字符最長不能超過10個字符長,如果字符長度超過了10個,結果中只出現前10個字符。 

[擴充]

  在這里,我們還要介紹一種方法:toJSON()方法

    有時候,我們並不能滿足JSON.stringify()方法對某些對象進行自定義化的需求,這時我們可以給對象定義toJSON()方法,返回其自身的JSON數據格式。代碼示例如下:

var book = {
		"title":"Javascript",
		"authors":[
			"foodoir JavaScript"
			],
		edition:3,
		year:2001,
		toJSON:function(){
			return this.title;
		}
};

var jsonText1 = JSON.stringify(book,null,4);
console.log(jsonText1);//Javascript

var jsonText2 = JSON.stringify(book,null,"------");
console.log(jsonText2);//Javascript

     這兩種方法返回的都是Javascript,其原因在於:toJSON方法返回的是圖書的書名(this.title=》book.title)。還可以讓toJSON方法返回任何值,它都能正常工作。從而toJSON方法可以作為函數過濾器的補充。假設把一個對象傳入JSON.stringify(),序列化該對象的順序如下:

  1、如果存在toJSON方法而且能通過它取到有效值,則調用該方法;否則,返回對象本身;

  2、如果提供了第二個參數,應該用這個函數過濾器。傳入函數過濾器的值是第1步返回的值;

  3、對第2步返回的每個值進行相應的序列化;

  4、如果提供了第三個參數,執行相應的格式化。

 

【JSON和XML的轉換】

   盡管JSON和XML中有很多相似之處,但是它們之間想要轉化是非常復雜的,這時候我們就需要框架和組件來幫忙了。在對JSON和XML進行轉換之前,我們需要在網上下載這三個資源。一個需要在jquery官網下載一個穩定的jquery版本,然后需要在前面介紹的www.json.cn里面下載兩個文件jquery.json2xml.js 和 jquery.xml2json.js (右側點擊JSON組件,查找后便可下載)。有了工具后,二者間的轉化將會變得很簡單。(關於XML我們這里不做專門的介紹,可以自己在網上查閱相關資料)

  XML 字符串轉換成 JSON 對象
    關鍵代碼:$.xml2json(str);

    需要注意的是:我們可以用前面的方法對我們的結果進行操作。
  JSON 對象轉換成 XML 字符串
    關鍵代碼:$.json2xml(obj);

  示例代碼如下:

<script src="jquery-2.1.4.min.js"></script>
<script src="jquery.xml2json.js"></script>
<script src="jquery.json2xml.js"></script> 
<script type="text/javascript">
var str = "<root>" +
		  "<name>Gfoodoir</name>" +
		  "<age>21</age>" +
		  "<friends>HTML</friends>" +
		  "<friends>CSS</friends>" +
		  "<friends>JAVASCRIPT</friends>" +
		  "</root>";

console.log(str);//輸出的結果為字符串

var obj = $.xml2json(str);
console.log(obj);//輸出的是Javascript對象

var jsonstr = JSON.stringify(obj);
console.log(jsonstr);//輸出的是JSON字符串

var person = {
	name: "foodoir",
	age: 21,
	mother: {
		name: "HTML",
		age: 22
	},
	a: function(){
		return 1;
	},
	b: null,
	c: undefined
};

var xmlstr = $.json2xml(person);
console.log(xmlstr);//輸出的是XML格式

</script>

   控台輸出結果:

【Ajax和JSON】

 JSON 文件被放置在服務器端,客戶端請求該文件用得最多的是 Ajax,能夠實現異步請求。

  1. Ajax 是什么
    AJAX,全稱 Asynchronous JavaScript and XML,即“異步的 JavaScript 和 XML”,一般寫作 Ajax。
    Ajax 能夠與服務器交換少量數據,從而異步地更新部分網頁。
    異步,指的是當 Ajax 執行交換數據的操作時,其他的操作仍然可以執行。
    一個最常見的應用是:打開百度或谷歌首頁,當輸入文字后,搜索欄下方會顯示出幾個建議的搜索詞。這正是 Ajax 的應用。

  2. 創建和使用 Ajax
    創建 Ajax 對象要考慮瀏覽器的版本問題,主要分為兩大類:IE7+/Chrome/Firefox/… 和 IE6/IE5.。
    function CreateXHR(){
        if (window.XMLHttpRequest)
        {
            //對瀏覽器 IE7+, Firefox, Chrome, Opera, Safari
            return new XMLHttpRequest();
        }
        else
        {
            //對瀏覽器 IE6, IE5
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    然后,只要用如下方式創建即可。
    var xmlhttp;
    xmlhttp = CreateXHR();
    服務器端有一個文件 test.json,請求並輸出。
    xmlhttp.open("GET","test.json",true);
    xmlhttp.send();
    xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
            var jsonstr = xmlhttp.responseText;
            console.log(jsonstr);
        }
    }

  其中,xmlhttp.readyState 存有 XMLHttpRequest 的狀態,有五個值:

    0: 請求未初始化
    1: 服務器連接已建立
    2: 請求已接收
    3: 請求處理中
    4: 請求已完成,且響應已就緒

  xmlhttp.status 的值為請求結果,200 表示“OK”,404 表示未找到頁面。
  獲取來自服務器的響應,可使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性,前者是以字符串形式,后者是以 XML 形式。

  完整代碼如下:

/*HTML代碼*/
<script>
var xmlhttp;
xmlhttp = CreateXHR();
xmlhttp.open("GET","test.xml",true);
xmlhttp.send();
xmlhttp.onreadystatechange = function(){
	if( xmlhttp.readyState == 4 && xmlhttp.status == 200 ){
		var xmlroot = xmlhttp.responseXML;
		console.log(xmlroot);
		var friends = xmlroot.getElementsByTagName("friends");
		console.log(friends);
	}
}

function CreateXHR(){
	if(window.XMLHttpRequest){
		// IE7++, Chrome, Firefox, ..
		return new XMLHttpRequest();
	}else{
		// IE6, IE5
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
}
</script>


/*JSON文件中的代碼*/
{
	"name": "foodoir",
	"age": 21,
	"friends": ["HTML", "CSS", "Javascript"]
}


/*XML文件中的代碼*/
<root>
	<name>foodoir</name>
	<age>21</age>
	<friends>HTML</friends>
	<friends>CSS</friends>
	<friends>javascript</friends>
</root>

   在同一個文件夾中如下命名:

  控制台結果為:

  因為這篇文章主要講JSON,我們對於AJAX就不做詳細介紹了。

 

【GeoJSON和TopoJSON】

 

   GeoJSON 和 TopoJSON 是符合 JSON 語法規則的兩種數據格式,用於表示地理信息。

1. GeoJSON

  GeoJSON 是用於描述地理空間信息的數據格式。GeoJSON 不是一種新的格式,其語法規范是符合 JSON 格式的,只不過對其名稱進行了規范,專門用於表示地理信息。

  GeoJSON 的最外層是一個單獨的對象(object)。這個對象可表示:

    - 幾何體(Geometry)。
    - 特征(Feature)。
    - 特征集合(FeatureCollection)。

  最外層的 GeoJSON 里可能包含有很多子對象,每一個 GeoJSON 對象都有一個 type 屬性,表示對象的類型,type 的值必須是下面之一。

    - Point:點。
    - MultiPoint:多點。
    - LineString:線。
    - MultiLineString:多線。
    - Polygon:面。
    - MultiPolygon:多面。
    - GeometryCollection:幾何體集合。
    - Feature:特征。
    - FeatureCollection:特征集合。

  下面舉幾個例子。

  點對象:
    {
    "type": "Point",
    "coordinates": [ 111.6, 29.65 ]
    }

  線對象:
      {
      "type": "LineString",
      "coordinates": [[111, 29 ], [112, 26 ]]
      }

  面對象:
    {
    "type": "Polygon",
    "coordinates":[[ [30, 0], [31, 0], [31, 5], [30, 5], [30, 0] ]]
    }


由以上格式可以發現,每一個對象都有一個成員變量 coordinates。如果 type 的值為 Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon 之一,則該對象必須有變量 coordinates。
如果 type 的值為 GeometryCollection(幾何體集合),那么該對象必須有變量 geometries,其值是一個數組,數組的每一項都是一個 GeoJSON 的幾何對象。例如:
      {
          "type": "GeometryCollection",
          "geometries": [
              {
                  "type": "Point",
                  "coordinates": [100, 40]
              },
              {
                  "type": "LineString",
                  "coordinates": [ [100, 30], [100, 35] ]
              }
          ]
      }

如果 type 的值為 Feature(特征),那么此特征對象必須包含有變量 geometry,表示幾何體,geometry 的值必須是幾何體對象。此特征對象還包含有一個 properties,表示特性,properties 的值可以是任意 JSON 對象或 null。例如:
      {
          "type": "Feature",
          "properties": {
             "name": "常德"
          },
          "geometry": {
              "type": "Point",
              "coordinates": [ 111.6, 29.65 ]
          }
      }

如果 type 的值為 FeatureCollection(特征集合),則該對象必須有一個名稱為 features 的成員。features 的值是一個數組,數組的每一項都是一個特征對象。


2. TopoJSON

  TopoJSON 是 GeoJSON 按拓撲學編碼后的擴展形式,是由 D3 的作者 Mike Bostock 制定的。相比 GeoJSON 直接使用 Polygon、Point 之類的幾何體來表示圖形的方法,TopoJSON 中的每一個幾何體都是通過將共享邊(被稱為arcs)整合后組成的。

  TopoJSON 消除了冗余,文件大小縮小了 80%,因為:
      邊界線只記錄一次(例如廣西和廣東的交界線只記錄一次)。
      地理坐標使用整數,不使用浮點數。
  這里我們就不再驗證,自己去試驗就好。

3. 在線工具
  在線生成 GeoJSON:http://geojson.io/
  簡化、轉換 GeoJSON 和 TopoJSON:http://mapshaper.org/

 到這里,關於JSON就介紹的差不多了,后面我們來介紹JSON的遍歷方法

  在JSON中,我們一般使用for/in來遍歷JSON中的值,代碼如下:

var json = {
	"a":12,
	"b":21
}
for(var il in json){
	console.log(il);//a,b
	console.log(json[il]);//12,21
}

   根據鍵值對("name":"value")的形式,我們很快便能分析出結果。

 分析了JSON的眾多特點,發現它和Javascript中的數據類型有很多相似的地方,但是從一開始我們就說了JSON是一種數據交換格式,那么我們該如何判斷Javascript數據類型和JSON呢?參考代碼(這里不做解釋,相信聰明的你看完了這篇文章了一定會懂):

var parseType = function(obj) {
	var type = typeof obj;
	if("object" === type) {
		if(obj) {
			if(obj instanceof Array) {
				return "array";
			}
			if(obj instanceof Object) {
				return type;
			}
			var native_obj = Object.prototype.toString.call(obj);
			if("[object Window]" === native_obj) {
				return "object";
			}
			if("[object Array]" === native_obj || "number" === typeof obj.length && "undefined" !== typeof obj.splice && "undefined" !== typeof obj.propertyIsEnumerable && !obj.propertyIsEnumerable("splice")) {
				return "array";
			}
			if("[object Function]" === native_obj || "undefined" !== typeof obj.call && "undefined" !== typeof obj.propertyIsEnumerable && !obj.propertyIsEnumerable("call")) {
				return "function";
			}
		} else {
			return "null";
		}
	} else if("function" === type && "undefined" === typeof obj.call) {
		return "object";
	}
	return type;
};

 

作者的話:本來是在學習AJAX時關於JSON有一些疑問,后面在網上和書上查找相關方面的資料,感覺不是很完整,后面干脆自己將所看到的和理解的東西整理出來。其中有部分圖片是來源於網上。看書的話請參考《Javascript高級程序設計(第3版)》中的第20章(P562-P570),另外,其中有什么錯誤希望看到的親們幫我指出來,謝謝!同時也歡迎大家一起交流~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM