JSON
在使用名稱/值對或XML時,實際上是使用javascript從應用程序中取得數據并將數據轉換成另一種數據格式。javascript不僅作為格式化語言使用,還可以使用javascript語言中的對象來表示數據。
將javascript對象轉換成可以隨請求發送的數據(同步異步都可以)。
簡單的說,JSON可以將javascript對象中表示的一組數據轉換為字符串,然后就可以在函數之間輕松的傳遞這個字符串,或者在異步應用程序中將字符串從web客戶機傳遞給服務器端程序。
JSON可以表示數組和復雜的對象,而不僅僅是鍵和值得簡單列表。
JSON表示名稱/值對:
{"name1":"rose1","name2":"rose2","name3":"rose3"}
多個鍵/值逗號分開。
值的數組
表示一組值時,將多個帶花括號的記錄分組在一起。
{
"people":[
{"name":"rose1","age":"18","email":"1554@555.com"},
{"name":"rose2","age":"28","email":"15dd4@555.com"},
{"name":"rose3","age":"38","email":"5554@555.com"}
]
}
只有people是變量,值是包含三個條目的數組,每個條目是一個人的記錄,其中包含名字,年齡和電子郵件。上面演示如果用括號將記錄組合成一個值,當然也可以使用相同的語法表示多個值(每個值包含多個記錄)
{
"authors":[
{"name":"rose1","age":"18","email":"1554@555.com"},
{"name":"rose2","age":"28","email":"15dd4@555.com"},
{"name":"rose3","age":"38","email":"5554@555.com"}
],
"musicians":[
{"name":"rose1","age":"18","email":"1554@555.com"},
{"name":"rose2","age":"28","email":"15dd4@555.com"},
{"name":"rose3","age":"38","email":"5554@555.com"}
]
}
注意了 在不同的條目authors,musicians之間,里面的名稱/值可以不一樣的。在處理JSON格式的數據時,沒有需要遵守的預定義的約束。所以,在同樣的數據結構中,可以用不同的數據表示方式,甚至可以以不同的方式來表示同一事物。
在javascript中使用JSON
JSON是javascript原生格式,這意味著在javascript中處理JSON數據不需要任何特殊的API或工具包。
將JSON數據賦值給變量:
可以將JSON格式的數據字符串直接賦值給javascript變量。
var people=
{
"authors":[
{"name":"rose1","age":"18","email":"1554@555.com"},
{"name":"rose2","age":"28","email":"15dd4@555.com"},
{"name":"rose3","age":"38","email":"5554@555.com"}
],
"musicians":[
{"name":"rose1","age":"18","email":"1554@555.com"},
{"name":"rose2","age":"28","email":"15dd4@555.com"},
{"name":"rose3","age":"38","email":"5554@555.com"}
]
}
訪問數據:
上面的長字符串實際上只是一個數組,將這個數組放進javascript變量之后,就可以輕松訪問它。只需要用點好表示法來表示數組元素。
所以要訪問authors列表中的第一個條目的姓名:
people.authors[0].name;
注意,數組索引是從0開始。所以這行代碼首先訪問變量people,然后移動到authors條目,再移動到第一個記錄,最好訪問name鍵的值。結果是:rose1。
使用這樣的語法可以處理任何JSON格式的數據。
修改JSON數據
可以用點號和括號訪問數據,也可以用同樣的方法修改數據。
people.authors[0].name="summer";
在將字符串轉換為javascript對象之后,就可以這樣修改變量的值。
轉換回字符串
將對象轉換回字符串。
String newJSONtext=people.toJSONString();
現在就獲得了一個可以在任何地方使用的文本字符串,如,將它用在AJAX中的請求字符串。
重要的是,可以將任何javascript對象轉換為JSON文本。并非只能處理原來用JSON字符串賦值的變量。現在對名為的對象進行轉換,只需執行相同形式的命令即可:
String myObjectJSON=people.toJSONString();
使用JSON,只需要一個簡單的函數,就可以獲得經過格式化的數據,這樣就可以將數據轉換為可以在請求中發送給服務器端程序的格式。
這種格式很容易用于發送和接收與對象甚至對象數組對應的數據。
JSON的真正價值:
JSON是適用于ajax應用程序的一種有效格式,因為它使javascript對象和字符串值之間得以最快轉換,由于ajax應用程序很適合用純文本發送給服務器端程序,還可以接收純文本。
XML也可以提供文本方面的類似的益處,但用于將javascript對象轉換成XML的幾個現有的API沒有JSON API成熟。
JSON最大的價值及時可以將javascript真正的作為javascript而非數據格式語言進行處理。你之前所學到的所有有關javascript對象的技巧都額可以在代碼中使用,而無需考慮如何將這些對象轉換為文本。你只需在之后,用該JSON方法調用即可:
String myObjectJSON=myObject.toJSONString();
現在就可以可以將結果發送給服務器了。
將JSON發送給服務器
通過GET以名稱/值對發送JSON
將JSON數據發給服務器的最簡單方法就是將其轉換為文本,然后以名稱/值對的值得方法進行發送。注意的是,JSON格式的數據是相當長的一個對象。
var people= { "authors":[ {"name":"rose1","age":"18","email":"1554@555.com"}, {"name":"rose2","age":"28","email":"15dd4@555.com"}, {"name":"rose3","age":"38","email":"5554@555.com"} ], "musicians":[ {"name":"rose1","age":"18","email":"1554@555.com"}, {"name":"rose2","age":"28","email":"15dd4@555.com"}, {"name":"rose3","age":"38","email":"5554@555.com"} ] }
要以名稱/值對將其發送到服務器端,如下
var url="xx.php?people="+people.toJSONString(); myhttp.open("GET",url,true); myhttp.send(null);
值得注意的是,JSON數據中會有空格和各種字符,web瀏覽器往往會試著對其進行解析。要確保這些字符不會再服務器上(或者在將數據發送給服務器的過程中)引起混亂,需要用javascript的escape()方法處理下。
var url="xx.php?people="+escape(people.toJSONString();) myhttp.open("GET",url,true); myhttp.send(null);
TIP: escape()函數可以處理空格,斜線和其他任何可能影響瀏覽器的內容,并將它們轉換成WEB可用字符(如
文章列表