這一天是透過 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))

但是使用下列兩種方式都失敗:
 

  1. 在 jQuery.ajax 裡設定屬性「dataType: 'json'」之後,就不再會執行到 success的函式了,而是一直跑到 error 的函式。
  2. 使用 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


 

arrow
arrow

    小攻城師 發表在 痞客邦 留言(2) 人氣()