JSON 是適用於 Ajax 應用程序的一種有效格式,原因是它使 JavaScript 對象和字符串值之間得以快速轉換。由於 Ajax 應用程序非常適合將純文本發送給服務器端程序並對應地接收純文本,相比不能生成文本的 API,能生成文本的 API 自然更可取;而且,JSON 讓您能夠處理本地 JavaScript 對象,而無需為如何表示這些對象多費心思。
XML 也可以提供文本方面的類似益處,但用於將 JavaScript 對象轉換成 XML 的幾個現有 API 沒有 JSON API 成熟;有時,您必須在創建和處理 JavaScript 對象時格外謹慎以確保所進行的處理能與所選用的 XML 會話 API 協作。但對於 JSON,情況就大不相同:它能處理幾乎所有可能的對象類型,並會返回給您一個非常好的 JSON 數據表示。 因此,JSON 的最大價值在於可以將 JavaScript 真的作為 JavaScript 而非數據格式語言進行處理。
您所學到的所有有關使用 JavaScript 對象的技巧都可以應用到代碼中,而無需為如何將這些對象轉變成文本而多費心思。
1. 回車問題
JSON傳值的時候,如果有回車符就會掛的。我們可以使用正則來去掉回車符:
1 |
$str = preg_replace( "'([\r\n])[\s]+'" , "" , $str ); |
2 |
3 |
// 不用正則 |
4 |
$str = str_replace ( "\n" , "" , $str ); |
轉出來的字符串就沒有回車符的困擾了。
順便記錄一個PHP過濾腳本:
01 |
<?php |
02 |
// $document 應包含一個 HTML 文檔。 |
03 |
// 本例將去掉 HTML 標記,javascript 代碼 |
04 |
// 和空白字符。還會將一些通用的 |
05 |
// HTML 實體轉換成相應的文本。 |
06 |
07 |
$search = array ( "'<script[^>]*?>.*?</script>'si" , // 去掉 javascript |
08 |
"'<[\/\!]*?[^<>]*?>'si" , // 去掉 HTML 標記 |
09 |
"'([\r\n])[\s]+'" , // 去掉空白字符 |
10 |
"'&(quot|#34);'i" , // 替換 HTML 實體 |
11 |
"'&(amp|#38);'i" , |
12 |
"'&(lt|#60);'i" , |
13 |
"'&(gt|#62);'i" , |
14 |
"'&(nbsp|#160);'i" , |
15 |
"'&(iexcl|#161);'i" , |
16 |
"'&(cent|#162);'i" , |
17 |
"'&(pound|#163);'i" , |
18 |
"'&(copy|#169);'i" , |
19 |
"'&#(\d+);'e" ); // 作為 PHP 代碼運行 |
20 |
21 |
$replace = array ( "" , |
22 |
"" , |
23 |
"\\1" , |
24 |
"\"" , |
25 |
"&" , |
26 |
"<" , |
27 |
">" , |
28 |
" " , |
29 |
chr (161), |
30 |
chr (162), |
31 |
chr (163), |
32 |
chr (169), |
33 |
"chr(\\1)" ); |
34 |
35 |
$text = preg_replace ( $search , $replace , $document ); |
36 |
?> |
2. HTML特殊字符
從服務器端以JSON格式將數據傳遞到客戶端后,通過JS顯示在HTML頁面時,有一些特殊字符不能直接顯示,如后台傳遞過來的是 '<b>msg</b> #' 通過JS顯示在HTML頁面中時,顯示成了 msg # ,並不是msg #,這是由於<與>之間的內容看作是HTML標簽了,而以&開頭的 與#為HTML實體,所以顯示不正常。
解決辦法很簡單,在JS將其渲染到HTML頁面前轉換一下即可:
01 |
<script type= "text/javascript" > |
02 |
var str = '<b>msg</b> #' ; |
03 |
document.all.div1.innerHTML= '<pre>' +str+ '</pre>' ; |
04 |
|
05 |
//js中的字符串正常顯示在HTML頁面中 |
06 |
String.prototype.displayHtml= function (){ |
07 |
//將字符串轉換成數組 |
08 |
var strArr = this .split( '' ); |
09 |
//HTML頁面特殊字符顯示,空格本質不是,但多個空格時瀏覽器默認只顯示一個,所以替換 |
10 |
var htmlChar= "&<>" ; |
11 |
for ( var i = 0; i< str.length;i++){ |
12 |
//查找是否含有特殊的HTML字符 |
13 |
if (htmlChar.indexOf(str.charAt(i)) !=-1){ |
14 |
//如果存在,則將它們轉換成對應的HTML實體 |
15 |
switch (str.charAt(i)) { |
16 |
case '<' : |
17 |
strArr.splice(i,1, '<' ); |
18 |
break ; |
19 |
case '>' : |
20 |
strArr.splice(i,1, '>' ); |
21 |
break ; |
22 |
case '&' : |
23 |
strArr.splice(i,1, '&' ); |
24 |
} |
25 |
} |
26 |
} |
27 |
return strArr.join( '' ); |
28 |
} |
29 |
alert(str.displayHtml()); |
30 |
document.all.div2.innerHTML=str.displayHtml(); |
31 |
</script> |
3. escape()函數
該函數可以處理空格、斜線和其他任何可能影響瀏覽器的內容,並將它們轉換成 Web 可用字符(比如,空格會被轉換成 %20,瀏覽器並不會將其視為空格處理,而是不做更改,將其直接傳遞到服務器)。之后,服務器會(通常自動)再把它們轉換回它們傳輸后的本來 “面目”。
1 |
var url = "nowamagic.php?people=" + escape(people.toJSONString()); |
2 |
request.open( "GET" , url, true ); |
3 |
request.onreadystatechange = updatePage; |
4 |
request.send( null ); |
這種做法的缺點有兩個: 在使用 GET 請求發送大塊數據時,對 URL 字符串有長度限制。雖然這個限制很寬泛,但對象的 JSON 字符串表示的長度可能超出您的想象,尤其是在使用極其復雜的對象時更是如此。在跨網絡以純文本發送所有數據的時候,發送數據面臨的不安全性超出了您的處理能力。
簡言之,以上是 GET 請求的兩個限制,而不是簡單的兩個與 JSON 數據相關的事情。在想要發送用戶名和姓之外的更多內容,比如表單中的選擇時,二者可能會需要多加注意。若要處理任何機密或極長的內容,可以使用 POST 請求。
4. 引號問題
JSON中如果包含引號或雙引號,會破壞JSON的格式。有兩種方法可以解決。
在入庫的時候可以使用addslashes()函數處理一下字符串,給引號前加上斜杠。被改的字符包括單引號 (')、雙引號 (")、反斜線 backslash (\) 以及空字符NULL。
1 |
$text = addslashes ( $text ); |
JavaScript的話,可以這樣:
1 |
function valueReplace(v){ |
2 |
v=v.toString().replace( new RegExp( '(["\"])' , 'g' ),"\\\ "" ); |
3 |
return v; |
4 |
} |
5 |
var eValue = encodeURI($.trim(valueReplace(e.value))) |
就總結到這里。