JSON是一種輕量級(Light-Weight)、基於文本的(Text-Based)、可讀的(Human-Readable)格式jquery
JSON的名稱中雖然帶有JavaScript,但這是指其語法規則是參與JavaScript對象的,而不是指只能用於JavaScript語言。編程
JSON不管對於人,仍是對於機器來講,都是十分便於閱讀和書寫的,並且相比XML(另外一種常見的數據交換格式),文件更小,所以迅速成爲網絡上十分流行的交換格式。json
近年來JavaScript已經成爲瀏覽器上事實上的標準語言,JavaScript的風靡,與JSON的流行也有密切的關係。所以JSON自己就是參考JavaScript對象的規則定義的,其語法與JavaScript定義的語法幾乎徹底相同。數組
JSON格式創始人聲稱此格式永遠不升級,這就表示這種格式具備長時間的穩定性,10年前寫的文件,10年後也能用,沒有任何兼容性問題。瀏覽器
JSON的語法規則很簡單,可稱得上「優雅完美」總結起來有:服務器
-數組(Array)用方括號(「[ ]」)表示網絡
-對象(Object)用大括號(「{ }」)表示異步
-名稱/值對(name/value)組合成數組和對象編程語言
-名稱(name)置於雙引號中,值(value)有字符串、數值、布爾值、null、對象和數組函數
-並列的數據之間用逗號(",")分隔
{
"name":"lucy",
"age":"18"
}
JSON常被拿來與XML作比較,由於JSON的誕生原本就多多少少要有取代XML的意思。相比XML,JSON的優點以下:
-沒有結束標籤,長度更短,讀寫更快
-可以直接被被JavaScript解析器解析
-可使用數組
JSON:{
"name":"lucy",
"age":21,
"friends":["lili","geen","mark"]
}
XML:
<root>
<name>lucy</name>
<age>21</age>
<friends>lili</friends>
<friends>geen</friends>
<friends>mark</friends>
</root>
在JavaScript中,有兩個方法與此相關:JSON.parse和JSON.stringify
JSON的語法規則十分簡單,不管用何種方法總結都只有數條而已,它參考了C語言家族的一些習慣,學習起來並不會感到陌生。
對象用大括號(「{ }」)括起來,大括號裏是一系列的「名稱/值對」。
兩個並列的數據之間用逗號(「,」)隔開,注意兩點:
-使用英文的逗號(",")不要使用中文的逗號(",")
-最後一個「名稱/值對」以後不要加逗號
數組表示一系列有序的值,用方括號(「[ ]」)包圍起來,並列的值之間用逗號隔開。
例如,如下數組是合法的
名稱(Name)是一個字符串,要用雙引號括起來,不能用單引號,也不能沒有引號,這一點與JavaScript不一樣。
值的類型只有七中:字符串(string)、數值(number)、對象(object)、數組(array)、布爾(true/false)、null、不能有這以外的類型,例如undefined、函數等。
字符串(string)的規則以下:
- 英文雙引號括起來,不能用單引號,也不能沒有
- 字符串中不能單獨出現雙引號(")和右斜槓("\")
- 若是要打雙引號或右斜槓,須要使用「右斜槓+字符」的形式
- 例如\"和\\,其餘的轉義字符也是如此
字符串的概念圖以下:
數值的概念圖以下:
解析,是指將符合JSON語法規則的字符串轉換成對象的過程。
不一樣的編程語言都提供瞭解析JSON字符串的方法,這裏主要講解JS中的解析方法,主要有三種:
- 使用eval()
- 使用JSON.parse()
- 使用第三方庫,例如JQuery等
eval()函數的參數是一個字符串,其做用是直接執行其中的JS代碼。
eval()可以解析JSON字符串,從這裏能夠看出JSON和JS是高度嵌合的。可是,如今已經不多直接使用eval()來解析了,如歌您的瀏覽器真的很舊,可能才須要這個方法。此外,eval()是一個相對危險的函數,由於字符串中可能含有未知因素。在這裏,做爲學習還要知道這也是一種方法。
請注意eval()的參數,在字符串兩旁加了括號,這是必須的,不然會報錯。
由於JSON字符串是被大括號("{ }")包圍的,直接放到eval()會被當成語句塊來執行,所以要在兩旁加上括號,使其變成表達式。
如今絕大多數瀏覽器都支持JSON.parse(),是推薦使用的方式。
若是輸入了不符合規範的字符串,會報錯。
JSON.parse()能夠有第二個參數,是個函數。此函數有兩個參數:name和value,分別表明名稱和值。當傳入一個JSON字符串以後,返回值將賦值給當前的名稱(name)。
利用第二個參數,能夠在解析JSON字符串的同時對數據進行一些處理。
序列化,指將JS值轉化爲JSON字符串的過程。
JSON.stringify()可以將JS值轉換成JSON字符串。
JSON.stringify()生成字符串能夠用JSON.parse()再還原成JS值。
JSON.stringify(value[,relacer[,space]])
value:必選參數。被變換的JS值,通常是對象或數組。
relacer:能夠省略。有兩種選擇:函數或數組。
-若是是函數,則每一組名稱/值對,都會調用此函數,該函數返回一個值,做爲名稱的值變換到結果字符串中,若是返回undefined,則該成員被忽略。
- 若是是數組,則只有數組中存在名稱纔可以被轉換,且轉換後順序與數組中的值保持一致。
space:能夠省略,這是爲了排版,方便閱讀而存在的。能夠在JSON字符串中添加空白或製表符等。
JQuery、jquery.json2xml.js、jquery.xml2json.js
$.xml2json(str)
$.json2xml(obj)
JSON文件被放置在服務器端,客戶端請求該文件用的最多的是Ajax,可以實現異步請求。
全稱Asynchronous JavaScript and XML即「異步的JavaScript和XML」,通常寫做Ajax
Ajax可以與服務器交換少許數據,從而異步地更新部分網頁。
異步,指的是當Ajax執行交換數據的操做時,其餘的操做仍然能夠執行。
一個最多見的應用是:打開百度或谷歌首頁,當輸入文字後,搜索欄下方會顯示出幾個建議的搜索詞。這正是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形式。
}
GeoJSON和TopJSON是符合JSON語法規則的兩種數據格式,用於表示地理信息。
GeoJSON是用於描述地理空間信息的數據格式。GeoJSON不是一種新的格式,其語法規範是符合JSON格式的,只不過對其名稱進行了規範,專門用於表示地理信息。
GeoJSON的最外層是一個單獨的對象(object)。這個對象可表示:
-幾何體(Geometry)
-特徵(Feature)
- 特徵幾何(FeatureCollection)
最外層的GeoJSON裏可能包含有不少子對象,每個GeoJSON對象都有一個type屬性,表示對象的類型,type的值必須是下面之一。
- point:點
- MultiPoint:多點
-LineString:線
-MultiLineString:多線
-Polygon:面
-MultiPolygon:多面
-GeometryCollection:幾何體集合
-Feature:特徵
下面舉幾個例子:
點對象:
{
"type":"Point",
"coordinates":[-105,39]
}
線對象:
{
"type":"LineString",
"coordinates":[[-105,39],[-107,38]]
}
面對象:
{
"type":"Polygon",
"coordinates":[[ [30,0], [31,0], [31,5], [30,5], [30,0] ]]
}
由以上格式能夠發現,每個對象都有一個成員變量coordinates.
若是type的值爲Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon之一,則對象必須有變量coordinates。
若是type的值爲GeometrayCollection(幾何體集合)那麼該對象必須有變量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": [ 116.3671875, 39.977120098439634]
}
}
若是type的值爲FeatureCollection(特徵集合),則該對象必須有一個名稱爲features的成員。features的值是一個數組,數組的每一項都是一個特徵對象。
TopoJSON是GeoJSON按拓撲學編碼後的擴展形式,是由D3的做者Mike Bostock制定的。相比GeoJSON直接使用Ploygon、Point之類的幾何體來表示圖形的方法,TopoJSON消除了冗餘,文件大小縮小了80%,由於邊界線只記錄一次(例如廣西和廣東的交界線只記錄一次)。地理座標使用整數,不使用浮點數。
在線生成GeoJSON:http://geojson.io/
簡化,轉換GeoJSON和TopoJSON:http://mapshaper.org/
未完待續(今天有點晚了,後期更).....