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年前就已經在使用了。2006年Douglas Crockford把JSON提交給IETF后,JSON開始作為Javascript的一個嚴格的子集,它用Javascript中的一些模式來表示結構化數據。而在Javascript中,JSON無疑是更好的讀寫結構化數據的方式。
【JSON的特點】
1、JSON是一種輕量級的數據交換格式(不是一種編程語言);
2、JSON是存儲和交換文本信息的語法,類似於XML,采用鍵值對的方式來組織,從而易於閱讀和編寫,同時也易於機器解析和生成;
3、JSON采用與編程語言無關的文本格式,但是也使用了類C語言(包括C,C++,C#,Java,JavaScript,Perl,Python等)的習慣,這些特性使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),另外,其中有什么錯誤希望看到的親們幫我指出來,謝謝!同時也歡迎大家一起交流~~~
