這一天是透過 jQuery.ajax() 送出 request 後,發生資料拿不回來的錯誤。故事是這樣發生的──我有一段短短的 AJAX 和很簡單的 PHP,AJAX 大概是長成這個樣子的:
$.ajax({
url:"test.php",
cache:false,
dataType:'json',
success:function(data){
// data = jQuery.parseJSON(data);
$("#test").html(data); // 設定取得值
},
error:function(e){}
});
上述的 AJAX 要連接的 test.php 的內容很簡單,是這樣的 JSON 內容:
<?php
echo"{ 'count': 999 }";
?>
因為透過 jQuery.ajax() 把 data 拿回來以後,它只是個字串,還得再處理,所以想把這個 JSON 格式的字串轉成 JSON 物件。(也就是我在 JavaScript 裡註解掉的那行 jQuery.parseJSON(data))
但是使用下列兩種方式都失敗:
- 在 jQuery.ajax 裡設定屬性「dataType: 'json'」之後,就不再會執行到 success的函式了,而是一直跑到 error 的函式。
- 使用 jQuery.parseJSON(),在 Firebug 會看到跑出「json.parse: expected property name or '}'」的錯誤。
看了《$.ajax返回的JSON無法執行success的解決方法》和《重新认识JSON》,才發現我這樣設定 JSON 的格式是不正確的。
根據 JSON 的官方說明,一組 JSON 資料是以 { string : value } 這樣的型態來組合的,而作為鍵值 (key) 的 string 外面是要包上雙引號的。雖然說在 JavaScript 和 PHP 都可以使用單引號來包字串,但是在 JSON 這樣是行不通的。
用中文來形容這一組 JSON 的值的話,它應該是這樣組合的:大括號、以雙引號包起來的鍵值名稱、冒號、以雙引號包起來的值。
所以我的 PHP 應該要改寫如下:
<?php
echo '{ "count": 999 }';
?>
就是把雙引號和單引號反過來用啦,這樣就可以了欸。
值 (values) 的部分因為是數值 (999),所以不用以雙引號包起來也沒有關係,加上雙引號也是不會出錯的。但如果此處的值是字串,比方說 an-apple,那就要以雙引號包起來,寫成 "an-apple"。
Google 的過程中發現被這個 JSON 單雙引號的格式問題打到的人還真多,可惜我之前都沒留意到。 Orz
留言列表